Beruflich Dokumente
Kultur Dokumente
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 pequea entrada sobre su uso. Dividiremos la serie en al menos 2 artculos: 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 aplicacin 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 darn 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: o o AppEjemploEfCodeFirst.Web debe hacer referencias a: AppEjemploEfCodeFirst.Data AppEjemploEfCodeFirst.Data.Entities
4. Agregar la cadena de conexin a la base de datos, aunque es suficiente con agregarla al proyecto de datosAppEjemploEfCodeFirst.Data tambin es recomendable agregarlo al proyecto Web AppEjemploEfCodeFirst.Web. El fichero de configuracin (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 (cdigo primero), las entidades las creremos 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 slo queda hacer uso del contexto y las entidades, para ello escribiremos en el Load de alguna pgina o en elController en el caso de usar MVC.
namespace AppEjemploEFCodeFist.Controllers { public class HomeController : Controller { public ActionResult Index() { var ctx = new AppEjemploEfCodeFirstDbContext();
8. Ya todo est listo, compilamos la aplicacin 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 cdigo.
Conclusiones: Hemos visto como mediante el uso de EF 5 podemos crear el cdigo de nuestras entidades en C# o VB.Net y posteriormente generar automticamente 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.
{ 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; } } }
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 (importantsimo) escoger el proyecto al cual queremos habilitarle la migracin (AppEjemploEfCodeFirst.Data). 3. Escribir el siguiente comando en la consola (Enable-Migrations) y presionar enter. Con esto hemos habilitado la migracin manual, mas adelante veremos la migracin automtica. Podrs observar que en el proyecto escogido para habilitarle la migracin (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 migracin. 5. Y por ultimo escribimos otro comando en la consola (Update-Database). Ya tendramos el modelo de base de datos actualizado con los cambios realizados en las entidades.
Veamos como hacerlo: Primero debemos ir a la clase (Configuration) y modificar la siguiente lnea de cdigo del Constructor:
public Configuration() { AutomaticMigrationsEnabled = true; }
Despus debemos registrar el inicializador MigrateDatabaseToLatestVersion. Para ello escribimos el siguiente cdigo en el Global.asax, mtodo Application_Start (o cualquier otro punto de entrada de nuestra aplicacin);
Database.SetInitializer(new on>()); MigrateDatabaseToLatestVersion<AppEjemploEfCodeFirstDbContext, Configurati
Y con esto todo listo, ya puedes hacer cualquier modificacin en el cdigo (clases POCO) y despus de ejecutar la aplicacin, los cambios sern migrados a la base de datos. 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.