.NET Core Entity Framework – Agregar migración para contexto en la biblioteca de clases

Tengo problemas para agregar una migración inicial al contexto de la base de datos de Entity Framework dentro de una biblioteca de clases .NET Core.

Cuando corro

dotnet ef migrations add migrationName -c PlaceholderContext 

Me sale error

 Could not invoke this command on the startup project 'Placeholder.Data'. This version of the Entity Framework Core .NET Command Line Tools does not support commands on class library projects in ASP.NET Core and .NET Core applications. See http://go.microsoft.com/fwlink/?LinkId=798221 for details and workarounds. 

Así que hice clic en el enlace y aprendí que no es posible agregar una migración a una biblioteca de clases. Sin embargo, puede convertir el proyecto de biblioteca de clases en un proyecto de “aplicación”, pero al hacerlo no puedo hacer referencia a este proyecto de “aplicación” desde mi capa empresarial (biblioteca de clases).

Estructura del proyecto:

Placeholder.Web (WebAPI) => Placeholder.Business (biblioteca de clases) => Placeholder.Data (biblioteca de clases)

Estructura del proyecto

Placeholder.Web => Startup.cs

  public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.AddMvc(); //HERE WE REGISTER DB CONTEXT, (STATIC CLASS IN BUSINESS LAYER) services.InjectBusinessContext(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=Placeholder;Integrated Security=True;Connect Timeout=30;"); services.InjectWebServices(); services.InjectBusinessServices(); } 

¿Cómo puedo superar este problema realmente molesto?

Actualizar (1)

He convertido mi biblioteca de clases Placeholder.Data en una “aplicación” con un método principal estático. Porque ya no puedo hacer referencia a Placeholder.Data de Placeholder.Negocios Tengo que ir con la solución 2 que figura en la página del documento de Microsoft. Cuando ejecuto el script de migración, obtengo lo siguiente:

No se ha configurado ningún proveedor de base de datos para este DbContext. Se puede configurar un proveedor anulando el método DbContext.OnConfiguring o usando AddDbContext en el proveedor de servicios de la aplicación. Si se utiliza AddDbContext, asegúrese también de que su tipo DbContext acepte un objeto DbContextOptions en su constructor y lo pase al constructor base para DbContext

Por supuesto, esto no funcionará, el dbcontext se registra desde mi aplicación Placeholder.Web, (a través de la capa empresarial). Entonces mi única opción es agregar un nuevo contexto en el nuevo método principal estático y realmente no quiero hacer esto …

No necesita ‘convertir’ su proyecto de datos a una aplicación. Aquí hay una aplicación de prueba con una estructura similar:

estructura del proyecto

En el project.json en el proyecto de datos, agregue los paquetes de nuget del núcleo asp.net.

proyecto.json

Ahora, para crear una migración, simplemente haga clic derecho en el proyecto de datos, elija ‘Abrir carpeta en el explorador de archivos’, luego en el explorador de archivos, presione Mayús + clic derecho y ‘Abrir ventana de comandos aquí’.

Para crear la migración, simplemente especifique el ‘proyecto de inicio’ como la aplicación web (donde existe el archivo startup.cs)

 dotnet ef --startup-project ../TestPatterns2.Web migrations add Second 

migraciones

Y voila, migración:

segunda migración

PARA AÑADIR LA CARPETA DE MIGRACIÓN AL PROYECTO DE DATOS: cuando definió el servicio, agregue el punto de migración de esta manera

 services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("TestPatterns2.Data"))); 

Solo necesita ser una aplicación para realizar la migración (necesita un punto de entrada), así que después de convertir la biblioteca en una aplicación y crear su migración, comente los elementos buildOptions y runtimes en su project.json. Ahora se construirá como una biblioteca de nuevo.

Descoméntelos siempre que necesite agregar otra migración.