En este artículo desarrollamos una aplicación de consola sencilla, usando Code First con EF Core 1.1, con el fin explorar algunos aspectos básicos del trabajo con EF Core.
Puntos Importantes
Paquetes mínimos necesarios para trabajar con EF Core.
Clases de configuración con Fluent API.
Leer string de conexión de archivos configuración.
Usar de EF Core CLI para crear la migración inicial.
Salvar el archivo desde VS para actualizar todos los paquetes o, si prefiere usar la interfaz de comandos de desarrollo ([Shift]+[Alt]+[,]), ejecute dotnet restore
Detalles de project.json
Importante
Aquí vemos los paquetes mínimos necesarios para trabajar con EF Core
Paquetes de Entity Framework Core
Microsoft.EntityFrameworkCore: Paquete base
Microsoft.EntityFrameworkCore.Design: Componentes para EF Core CLI, sólo para desarrollo, por eso "type": "build"
Microsoft.EntityFrameworkCore.Tools.DotNet: EF Core CLI
Microsoft.EntityFrameworkCore.SqlServer: SQL Server provider
Paquetes para manejar archivos de configuración
Microsoft.Extensions.Configuration: Paquete base
Microsoft.Extensions.Configuration.Binder: Para manejar configuraciones “strongly typed”.
Microsoft.Extensions.Configuration.Json: Manejo de archivos json
Otros
System.ComponentModel.Annotations: Annotations para los modelos
Estas clases permiten manejar una clase de configuración por cada clase del modelo, para mantener el DbContext lo más sencillo posible, de forma similar a como se puede hacer con EF 6, según lo sugerido en https://github.com/aspnet/EntityFramework/issues/2805
Aquí vemos como podemos manejar las opciones de configuración a través de clases auxiliares, para hacerlo de forma “strongly typed”.
Clases de configuración de la aplicación, permiten manejar la configuraciones que se carguen del archivo
appsettings.json de una forma “strongly typed”.
usingEFCore.App.Base;usingEFCore.App.Config;usingEFCore.App.Model;usingMicrosoft.EntityFrameworkCore;namespaceEFCore.App.Data{publicclassCommonDbContext:DbContext{// Must not be null or empty for initial create migration
privatestring_connectionString="ConnectionString";// Default constructor for initial create migration
publicCommonDbContext(){}// Normal use constructor
publicCommonDbContext(ConnectionStringsconnectionStrings){_connectionString=connectionStrings.DefaultConnection;}publicDbSet<Currency>Currencies{get;set;}protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptions){options.UseSqlServer(_connectionString);}protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.AddConfiguration(newCurrencyConfiguration());}}}
Program.cs
Importante
El método InitDb crea la base de datos o aplica las migraciones necesarias al arrancar la aplicación, en vez de hacerlo con el primer request. Esto mejora la experiencia del usuario.
El programa principal de la aplicación. Aquí están los métodos que crean/actualizan la base de datos y realizar la carga de datos iniciales.
usingEFCore.App.Config;usingEFCore.App.Data;usingEFCore.App.Model;usingMicrosoft.EntityFrameworkCore;usingMicrosoft.Extensions.Configuration;usingSystem;usingSystem.IO;usingSystem.Linq;usingSystem.Text;namespaceEFCore.App{publicclassProgram{privatestaticCurrency[]_currencyData=new[]{newCurrency{IsoCode="USD",Name="US Dolar",Symbol="US$"},newCurrency{IsoCode="EUR",Name="Euro",Symbol="€"},newCurrency{IsoCode="CHF",Name="Swiss Franc",Symbol="Fr."},};publicstaticAppOptionsAppOptions{get;set;}publicstaticIConfigurationRootConfiguration{get;set;}publicstaticvoidMain(string[]args){Console.OutputEncoding=Encoding.UTF8;Console.WriteLine("EF Core App\n");ReadConfiguration();InitDb();PrintDb();}privatestaticvoidInitDb(){using(vardb=newCommonDbContext(AppOptions.ConnectionStrings)){Console.WriteLine("Creating database...\n");db.Database.EnsureCreated();Console.WriteLine("Seeding database...\n");LoadInitalData(db);}}privatestaticvoidLoadInitalData(CommonDbContextdb){foreach(varitemin_currencyData){Currencycurrency=db.Currencies.FirstOrDefault(c=>c.Symbol==item.Symbol);if(currency==null){db.Currencies.Add(item);}else{currency.Name=item.Name;currency.Symbol=item.Symbol;}}db.SaveChanges();}privatestaticvoidPrintDb(){using(vardb=newCommonDbContext(AppOptions.ConnectionStrings)){Console.WriteLine("Reading database...\n");Console.WriteLine("Currencies");Console.WriteLine("----------");intsymbolLength=_currencyData.Select(c=>c.Symbol.Length).Max();intnameLength=_currencyData.Select(c=>c.Name.Length).Max();foreach(varitemindb.Currencies){Console.WriteLine($"| {item.IsoCode} | {item.Symbol.PadRight(symbolLength)} | {item.Name.PadRight(nameLength)} |");}Console.WriteLine();}}privatestaticvoidReadConfiguration(){varbuilder=newConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");Configuration=builder.Build();// Reads appsettings.json into a (strongly typed) class
AppOptions=Configuration.Get<AppOptions>();Console.WriteLine("Configuration\n");Console.WriteLine($@"connectionString (defaultConnection) = ""{AppOptions.ConnectionStrings.DefaultConnection}""");Console.WriteLine();}}}
4 - Generar la migración inicial
Importante
Aquí vemos la forma general de trabajar con el EF Core CLI.
Siempre podemos usar dotnet ef <comando> -h para consultar la ayuda del comando.
Ahora es necesario generar la migración inicial que utilizará EF para crear la base de datos cuando se ejecute la aplicación por primera vez.
Abrir la interfaz de comandos de desarrollo
Hacer click sobre el nodo del proyecto EFCore.App en el explorador de la solución.
Pulsar [Shift]+[Alt]+[,] o Botón derecho > Open Command Line > Developer Command Prompt
Ejecutar dotnet ef
Si todo marchó bien, debe observar una pantalla similar a la siguiente:
Crear la migración inicial
Ejecutar dotnet ef migrations add InitialCreateMigration en la interfaz de comandos.
Se puede utilizar cualquier nombre para la clase de la migración, pero recomiendo utilizar el sufijo “Migration” para evitar conflictos de nombres con otras clases de la aplicación.
También podemos utilizar dotnet ef [comando] --help para consultar la ayuda de cualquier comando de la interfaz.
Verificar que se hayan creado los archivos de la migración inicial, en la carpeta Migrations, similar a los siguientes:
Migrations\CommonDbContextModelSnapshot.cs
Este archivo es la configuración de la última versión del modelo, se utiliza al ejecutar el método DbContext.Database.EnsureCreated().
Observe que en esta clase está consolidada toda la definición de los objetos de base de datos, usando Fluent API, incluyendo los atributos utilizados en las propiedades del modelo de dominio.
Este archivo es el encargado de generar la migración desde la versión anterior de CommonDbContextModelSnapshot.cs, se utiliza al ejecutar el método DbContext.Database.Migrate().
Los números iniciales del nombre indican el año-mes-día-hora-minuto-segundo (yyyyMMddHHmmss) de generación de la migración.
Este string de conexión es adecuado para SQL Server Developer Edition con la instancia por default (MSSQLSERVER), puede ser necesario ajustarlo si la situación es distinta.
Suponiendo que ya se instaló el SQL Server 2016 Developer Edition, al ejecutar la aplicación con [Ctrl]+[F5] se debe obtener una salida similar a esta:
Y si en algún momento necesitamos empezar con una base de datos nueva, basta con eliminarla usando el SQL Server Management Studio y ejecutar la aplicación de nuevo.
Espero que este artículo le haya resultado útil y le invito a darme su opinión en la sección de comentarios.