Como en este artículo estamos separando los componentes de la aplicación, vamos a crear los archivos de programas y luego incluiremos los paquetes necesarios para poder compilar y ejecutar la solución.
En este artículo vamos a desarrollar la solución desde el principio, para apreciar los archivos .proj en su expresión más simple. No podríamos apreciar esto si hacemos la migración de un proyecto de VS 2015.
1 - Crear la solución EFCoreLib
Crear una solución “blank” llamada EFCoreLib
Crear el “solution folder” “src”
Crear la carpeta “src” dentro de la carpeta de la solución
2 - Crear proyecto src\EFCore.App
Importante
Este proyecto es la capa Cliente que usa la “capa de datos” (el proyecto EFCore.Lib)
Crear el proyecto como una “Console Application (.NET Core)”
3 - Crear proyecto src\EFCore.Lib
Importante
Este proyecto es la capa de Datos, desde luego de una forma muy rudimentaria.
Crear el proyecto como una “Class Library (.NET Core)”
4 - Crear los archivos de programa en EFCore.Lib
Vamos a crear en esencia los mismos archivos que usamos en el artículo Crear Aplicación EF Core.
A diferencia de lo que hicimos en el artículo Crear Aplicación EF Core, en el proyecto EFCore.Lib sólo incluimos la clase de configuración ConnectionStrings.cs porque sólo esta tiene que ver con la “capa de datos”.
usingEFCore.Lib.Base;usingEFCore.Lib.Config;usingEFCore.Lib.Model;usingMicrosoft.EntityFrameworkCore;namespaceEFCore.Lib.Data{publicclassCommonDbContext:DbContext{// Must not be null or empty for running 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());}}}
Para que el proyecto pueda compilar en este momento es necesario incluir los siguientes paquetes:
En este caso incluimos la clase que maneja todas las configuraciones de la “aplicación” haciendo referencia a la clase de configuración de la capa de datos.
Tal como se indica en la página de la interfaz de comandos .NET EF Core (.NET Core EF CLI) hay una limitación de .NET Standard que no permite ejecutar dotnet en un proyecto “Class Library”, así que hay que instalar los componentes necesarios en EFCore.App para ejecutarlo desde allí.
Si en este momento ejecutamos dotnet ef desde el proyecto EFCore.App
6.1 - Instalar “Tooling” de Entity Framework
Para esto hay que instalar el paquete Microsoft.EntityFrameworkCore.Tools en EFCore.App, pero este es un tipo de paquete “DotNetCliTool”, que no se puede instalar como un NuGet cualquiera.
Entonces, siguiendo lo indicado en la página de la interfaz de comandos .NET EF Core (.NET Core EF CLI), hay que editar el archivo .csproj del proyecto (Solution Explorer, sobre EFCore.App: Botón derecho > Edit EFCore.App.csproj) y agregar las líneas siguientes:
Al salvar el archivo se debe instalar el paquete automáticamente. En caso contrario utilice el comando dotnet restore desde la interfaz de comandos en el proyecto EFCore.App.
También hay que instalar el paquete: Microsoft.EntityFrameworkCore.Design.
Sin embargo, como sólo vamos a utilizar EFCore.App para ejecutar la .NET Core EF CLI, no es necesario agregar el atributo PrivateAssets=“All” manualmente en el archivo .csproj y, por lo tanto, podemos instalarlo como cualquier paquete NuGet.
6.2 - Crear la migración inicial
Después de esto ya podemos ejecutar el comando para crear la migración: dotnet ef migrations add InitialCreateMigration --project ..\EFCore.Lib.
Observe que usamos la opción --project o -p para indicar donde se va a crear la migración.
Después de ejecutar el comando obtenemos los archivos de la migración con el mismo contenido de la aplicación inicial:
7.2 - Cambiar propiedades del archivo de configuración
Configurar el archivo de “appasettings.json” para que se copie a la carpeta de salida
Botón Derecho > Properties sobre el archivo appsettings.json
Propiedad “Copy to Output Directory” => “Copy if newer”
7.3 - Establecer el proyecto EFCore.App como la aplicación de arranque
Ejecutar Botón Derecho > Set as Startup Project sobre el proyecto EFCore.App
El archivo EFCore.App.csproj resultante es así:
Importante
En el formato .csproj no es necesario especificar todos los archivos que conforman la solución, porque se considera, por omisión, todos los archivos de todas las carpetas.
Una ventaja importante de este formato es que elimina los frecuentes conflictos al hacer “Merge” de dos ramas, producidos por movimiento de archivos dentro del .csproj.