7
EF 5 Code First (Entity Framework Code First) En mis últimos desarrollos, estaba usando Entity Framework (EF) pero en su variante Base de Datos Primero (Database First), pero recientemente mi equipo y yo hemos apostado por EF Code First y estamos tan encantados con esta nueva maravilla del equipo de ADO.NET, que he decidido compartir esta pequeña entrada sobre su uso. Dividiremos la serie en al menos 2 artículos: 1. EF 5 Code First. Este post. 2. EF 5 Code First Migrations. Un segundo articulo que habla sobre las migraciones en Entity Framework Code First. EF 5 Code First 1. Crearemos una aplicación de ejemplo (AppEjemploEfCodeFirst) que contendrá 3 proyectos: AppEjemploEfCodeFirst.Web: Proyecto Web ASP.NET MVC 4 (Razor). AppEjemploEfCodeFirst.Data: Proyecto de tipo Biblioteca de Clases. Contendrá el contexto a la base de datos (BBDD). AppEjemploEFCodeFirst.Data.Entities: Proyecto de tipo Biblioteca de Clases. Contendrá las entidades, que darán lugar posteriormente a las tablas de la BBDD. 2. El siguiente paso será agregar Entity Framework (EF), para ello utilizaremos el Administrador de Paquetes NuGet. EF será agregado a dos de los tres proyectos: AppEjemploEfCodeFirst.Web AppEjemploEfCodeFirst.Data 1

EF 5 Code First

Embed Size (px)

Citation preview

Page 1: EF 5 Code First

EF 5 Code First (Entity Framework Code First)

En mis últimos desarrollos, estaba usando Entity Framework (EF) pero en su variante Base de Datos Primero (Database First), pero recientemente mi equipo y yo hemos apostado por EF Code First y estamos tan encantados con esta nueva maravilla del equipo de ADO.NET, que he decidido compartir esta pequeña entrada sobre su uso.

Dividiremos la serie en al menos 2 artículos:

1. EF 5 Code First. Este post.

2. EF 5 Code First Migrations. Un segundo articulo que habla sobre las migraciones en Entity Framework Code First.

 

EF 5 Code First

1. Crearemos una aplicación de ejemplo (AppEjemploEfCodeFirst) que contendrá 3 proyectos:

AppEjemploEfCodeFirst.Web: Proyecto Web ASP.NET MVC 4 (Razor).

AppEjemploEfCodeFirst.Data: Proyecto de tipo Biblioteca de Clases. Contendrá el contexto a la base de datos (BBDD).

AppEjemploEFCodeFirst.Data.Entities: Proyecto de tipo Biblioteca de Clases. Contendrá las entidades, que darán lugar posteriormente a las tablas de la BBDD.

2. El siguiente paso será agregar Entity Framework (EF), para ello utilizaremos el Administrador de Paquetes NuGet. EF será agregado a dos de los tres proyectos:

AppEjemploEfCodeFirst.Web

AppEjemploEfCodeFirst.Data

3. Agregar las referencias necesarias:

AppEjemploEfCodeFirst.Web debe hacer referencias a:

o AppEjemploEfCodeFirst.Data

o AppEjemploEfCodeFirst.Data.Entities

1

Page 2: EF 5 Code First

AppEjemploEfCodeFirst.Data debe hacer referencias a:

o AppEjemploEfCodeFirst.Data.Entities

4. Agregar la cadena de conexión a la base de datos, aunque es suficiente con agregarla al proyecto de datosAppEjemploEfCodeFirst.Data  también es recomendable agregarlo al proyecto Web AppEjemploEfCodeFirst.Web. El fichero de configuración (en mi caso) lucirá así:

<?xml version="1.0" encoding="utf-8"?><configuration>    <connectionStrings>        <add name="CodeFirstDBContext"              connectionString="server=.\SQLEXPRESS; database=AppEjemploEfCodeFirst; integrated security=true;"              providerName="System.Data.SqlClient" />    </connectionStrings>    …

5. Crear la primera entidad POCO (código primero), las entidades las creáremos en el proyecto de entidades (AppEjemploEfCodeFirst.Data.Entities)

namespace AppEjemploEfCodeFirst.Data.Entities{       public partial class Persona       {             public int PersonaId { get; set; }             public string Nombre { get; set; }             public string Apellidos { get; set; }             public DateTime FechaNacimiento { get; set; }       }}

6. Ahora crearemos la clase de contexto (AppEjemploEfCodeFirstDbContext) en el proyecto (AppEjemploEfCodeFirst.Data) esta clase debe heredar de DbContex.

namespace AppEjemploEfCodeFirst.Data{       public partial class AppEjemploEfCodeFirstDBContext : DbContext       {             public DbSet<Persona> Footballers { get; set; }       }}

7. Ahora sólo queda hacer uso del contexto y las entidades, para ello escribiremos en el Load de alguna página o en elController en el caso de usar MVC.

namespace AppEjemploEFCodeFist.Controllers{    public class HomeController : Controller    {        public ActionResult Index()

2

Page 3: EF 5 Code First

        {                    var ctx = new AppEjemploEfCodeFirstDbContext();                    ViewBag.LstPersonas = ctx.Personas.ToList();                    return View();        }    }}

8. Ya todo está listo, compilamos la aplicación y la ejecutamos y en cuanto se haga referencia al contexto de datos veremos que se crea la base de datos con la estructuras de las clases o entidades (POCO) que creamos por código.

 

Conclusiones: Hemos visto como mediante el uso de EF 5 podemos crear el código de nuestras entidades en C# o VB.Net y posteriormente generar automáticamente la base de datos.Pero ¿qué pasa si agrego una nueva entidad o modifico una existente? para resolver este problema debemos habilitar las migraciones (EF Code First Migrations). Este tema lo veremos en un post posterior.

 

Artículos relacionados:

EF Code First Migrations

EF Code First Migrations

Hace unos días escribí un articulo “EF 5 Code First (Entity Framework Code First)” que deberías leer antes que este. En aquel articulo explicaba como usar EF 5 Code First, en esta nueva entrada pretendo hablarles brevemente sobre:

1. EF Code First Migrations. Migraciones manuales.

2. EF Code First Migrations. Migraciones automáticas.

3. EF Code First Migrations. Otras consideraciones.

 

EF Code First Migrations. Migraciones manuales.

EF Code First Migrations, no es otra cosa que habilitar la capacidad de actualizar la base de datos con los cambios realizados en nuestras entidades de código (POCO)… pero veamos un ejemplo.

Sigamos con el mismo ejemplo del articulo anterior “EF 5 Code First (Entity Framework Code First)”, en el que teníamos una entidad Persona:

namespace AppEjemploEfCodeFirst.Data.Entities

3

Page 4: EF 5 Code First

{       public partial class Persona       {             public int PersonaId { get; set; }             public string Nombre { get; set; }             public string Apellidos { get; set; }             public DateTime FechaNacimiento { get; set; }       }}

Imaginemos que deseamos agregar una nueva propiedad, por ejemplo …. Numero de Documento, quedando así la nueva clase:

namespace AppEjemploEfCodeFirst.Data.Entities{       public partial class Persona       {             public int PersonaId { get; set; }             public string Nombre { get; set; }             public string Apellidos { get; set; }             public DateTime FechaNacimiento { get; set; }             public string DocumentoNo { get; set; }       }}

Si ejecutamos ahora la aplicación, recibiríamos un error como el siguiente:

Este error se debe a que no tenemos activada las migraciones (EF Code First Migrations) que por defecto viene desactivada, al menos de las versiones 4.3 a la 5.0 de EF. Pero no hay que preocuparse, habilitarla es muy simple, veamos como:

Pasos para habilitar EF Code First Migrations:

1. Ir al menú Herramienta / Administrador de paquetes de biblioteca / Consola del Administrador de paquetes.

2. Estando en la consola (importantísimo) escoger el proyecto al cual queremos habilitarle la migración (AppEjemploEfCodeFirst.Data).

3. Escribir el siguiente comando en la consola (Enable-Migrations) y presionar “enter”. Con esto hemos habilitado la migración manual, mas adelante veremos la migración automática. Podrás observar que en el proyecto escogido para habilitarle la migración (EF Code First Migrations) se ha creado una nueva carpeta (Migrations), aunque no es necesario puedes ojear un poco en los archivos creados para llevarte una idea de lo que esta sucediendo.

4. Escribir en la consola (Add-Migration Migracion1Prueba) la palabra Migracion1Prueba es un nombre cualquiera para identificar la migración.

4

Page 5: EF 5 Code First

5. Y por ultimo escribimos otro comando en la consola (Update-Database). Ya tendríamos el modelo de base de datos actualizado con los cambios realizados en las entidades.

  EF Code First Migrations. Migraciones automáticas.

Entity Framework te brinda además la posibilidad de que las migraciones se realicen de forma automática, así nos ahorraríamos el tener que ir a la Consola del Administrador de paquetes y escribir estos 2 comandos:

Add-Migration

Update-Database

Veamos como hacerlo:

Primero debemos ir a la clase (Configuration) y modificar la siguiente línea de código del Constructor:

public Configuration(){

AutomaticMigrationsEnabled = true;}

 Después debemos registrar el inicializador MigrateDatabaseToLatestVersion. Para ello escribimos el siguiente código en el Global.asax, método Application_Start (o cualquier otro punto de entrada de nuestra aplicación);

Database.SetInitializer(new                             MigrateDatabaseToLatestVersion<AppEjemploEfCodeFirstDbContext, Configuration>());

Y con esto todo listo, ya puedes hacer cualquier modificación en el código (clases POCO) y después de ejecutar la aplicación, los cambios serán migrados a la base de datos.

5

Page 6: EF 5 Code First

Consideraciones a tener en cuenta:

Puede que necesites cambiar el nivel de accesibilidad de la clase (Configuration)

Puede que tengas que agregar algunos (Namespace) al Global.asax.

 

EF Code First Migrations. Otras consideraciones.

Puede que se te presenten ciertos escenarios donde no se apliquen las migraciones automáticas. Por ejemplo cuando eliminas una columna o eliminas una entidad (tabla de datos).

No se ha aplicado la migración automática porque podría ocasionar una pérdida de datos.

En estos casos tendrás (al menos hasta la versión actual) que forzar la migración de forma manual, para ello escribirás el siguiente comando en la consola:

Update-Database -Force -Verbose

Existen además algunos casos en los que no es suficiente, pongamos un ejemplo: Imagina que tienes una entidad con una propiedad (public long Id { get; set; }) y decides cambiar el tipo a entero (public int Id { get; set; }).

En el caso anterior no basta con forzar la actualización. En este caso, mi consejo es que quites la entidad del modelo (o la propiedad) y fuerces la actualización (Update-Database -Force -Verbose), con esto se eliminará la tabla de datos, vuelves a incluir la entidad y nuevamente fuerzas la actualización para que cree la tabla con el nuevo tipo deseado.

6