Entity Framework Migrations

En este post, trataremos la migración de clases a una base de datos utilizando la tecnología Code First, gracias a la cual podemos crear bases de datos y contenido de forma automática a partir de clases que hayamos creado en una aplicación de tipo MVC. Pero, antes de ver la aplicación práctica, veamos más en detalle en qué consiste la tecnología Code First.

¿Qué es Code First?

Code First es un enfoque más de Entity Framework (hay otros dos enfoques que son Database First y Model First) que plantea lo siguiente: Tú crea clases POCO con tu lenguaje favorito (C#, VB.NET, etc.) y crea relaciones entre las mismas. Después, despreocúpate que yo persisto tu modelo en una base de datos.

Lo importante es entender que, con Code First, lo primero es el código. En vez de comenzar creando la base de datos y después con ingeniería inversa generar las clases POCO (como se hace con Database First), con Code First primero creamos el modelo con código y después se genera automáticamente la base de datos. Lo cierto es que, aunque el espíritu de Code First es el que acabamos de explicar, Code First también puede trabajar con bases de datos existentes.

Code First nos reporta las siguientes ventajas:

  • En nuestro proyecto sólo hablamos de código, no hablamos más de bases de datos ya que, al fin y al cabo, la base de datos será simplemente una forma más de persistir nuestro modelo (la base de datos será un medio, no el fin).
  • Parece que, definitivamente, resolvemos el problema del desajuste de impedancia. Esto es que nuestro proyecto ya no vive en dos mundos, el de la base de datos y el del código. Solamente con nuestras clases POCO y Linq podremos abordar cualquier proyecto.

Ejemplo práctico

Una vez explicado más en detalle en qué consiste Code First, veamos de forma práctica cómo podemos usarlo.

En primer lugar, creamos una aplicación web de tipo MVC:

Imagen1
Imagen2
Imagen3
Yo he llamado a esta aplicación: EFMigrations.

Creamos una clase que será la que llevaremos a una base de datos ya creada. La clase se llamará Empleado.cs:

Imagen4

Para esta clase, debemos realizar el using a System.ComponentModel.DataAnnotations, que nos permitirá definir la primary key de la tabla (mediante la decoración Key) y el tipo de datos de algunos de los atributos, que posteriormente serán las columnas de la tabla (mediante la decoración DataType(DataType.EmailAddress)). De forma que la clase Empleado «se convertirá» en tabla en la base de datos, y cada atributo de esta clase «se convertirá» en columna dentro de la tabla.

Imagen6

Una vez hecho esto, necesitamos instalar un nuget llamado EntityFramework para poder efectuar las migraciones:

Imagen7

Imagen8
Ahora creamos una clase dentro de la carpeta Models que funcionará como contexto, a la que llamaremos ContextoEmpleados. Las clases de tipo Contexto de EF deben heredar de la clase DbContext:

Imagen9

Además, cada entidad que tenemos en el Contexto está creada mediante un objeto de la clase DbSet.

Imagen10

Y, para evitar que ponga la tabla en plural a la hora de crearla, escribimos lo siguiente:

Imagen11

También debemos indicar en el constructor la cadena de conexión que debe utilizar:

Imagen12

La cadena de conexión se llama cadenaempleados, ya que es el nombre que hemos indicado en el archivo Web.config:

Imagen13

De forma que el Contexto quedaría así:

Imagen14

Ahora pasamos a crear el controlador llamado EmpleadosController que manejará los empleados. En este caso lo vamos a realizar con un asistente que nos creará las vistas y las acciones de forma automática para centrarnos más en la explicación de Code First que en la creación de controladores y vistas en MVC, pero también se podría realizar de forma manual:

Imagen15
Imagen16
Imagen17

Una vez creado el controlador con todas las vistas y acciones con el asistente, pasamos a la migración automática de la base de datos.

Para esto, tenemos que habilitar la migración de clases EF hacia el servidor, ya sea un servidor local (como lo estamos haciendo en este ejemplo) o alojado en otro lugar, como podría ser Azure. Por lo tanto, accedemos a la consola de Nuget:

Imagen18

Y escribimos lo siguiente: enable-migrations.

Imagen19

Además, añadimos las clases para automatizar la migración con la instrucción add-migration Initial:

Imagen20

Una vez hecho esto, podemos comprobar que nos ha creado dos clases para realizar la migración:

Imagen21

La clase Initial está heredando de la clase DbMigration, y su función es indicar cómo creará la tabla y el nombre que se le asignará en la base de datos.

Imagen22

Mientras que la clase Configuration contiene el método Seed, encargado de migrar los datos al servidor.

Imagen23

En esta clase debemos realizar varios cambios:

  • Cambiamos la migración automática a true:

Imagen24

  • Incluimos la instrucción para utilizar nuestro modelo Empleado realizando un using a Models:

Imagen25

  • Actualizamos el método Seed para que realice la actualización de datos en la base de datos, creando nuevos Empleados:

Imagen26

Ahora debemos escribir el comando update-database en la consola de Nuget, para que modifique la base de datos:

Imagen27

Podemos comprobar el resultado:

  • En Visual Studio, dentro de Sever Explorer, podemos observar que nos ha creado la tabla Empleados (que es el nombre que indicábamos antes en el Contexto), con sus columas y su clave primaria:

Imagen28

  • Por último, comprobamos si nos ha migrado bien los datos, iniciando la vista Index dentro de la carpeta Empleados:

Imagen29
Imagen30

  • También podríamos comprobarlo desde el SQL Server Management Studio:

Imagen31
Imagen32

 

Muchas gracias por vuestra atención y espero que este post os haya sido útil.

Autor: David Aguayo Hernández

Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin

Centro: Tajamar 

Año académico: 2017-2018

Código en Github: Github

Linkedin: David Aguayo

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.