Entity Framework 7 no se configura ningún proveedor de base de datos => cuando las migraciones se mueven a otro proyecto

asp.net-core c# entity-framework-core

Pregunta

Soy nuevo en EF7. Sé que esta es una pregunta duplicada para:

No hay proveedores de bases de datos configurados EF7

Pero espera antes de que quieras cerrar esta pregunta ... y sigue leyendo

 services.AddEntityFramework()
         .AddSqlServer()
         .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

 services.AddIdentity<ApplicationUser, IdentityRole>()
         .AddEntityFrameworkStores<ApplicationDbContext>()
         .AddDefaultTokenProviders();

  services.AddScoped<TestRepository, TestRepository>();

Ahora ejecuto el comando de actualización de la base de datos dnx ef en las ventanas cmd de mi proyecto EF y obtengo este error:

C:\TGB.DataAccess>dnx ef database update
System.InvalidOperationException: No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.
   bei Microsoft.Data.Entity.Internal.DatabaseProviderSelector.SelectServices(ServiceProviderSource providerSource)
   bei Microsoft.Data.Entity.Internal.DbContextServices.<>c__DisplayClass6_0.<Initialize>b__0()
   bei Microsoft.Data.Entity.Internal.LazyRef`1.get_Value()
   bei Microsoft.Data.Entity.Internal.DbContextServices.get_DatabaseProviderServices()
   bei Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c.<AddEntityFramework>b__0_8(IServiceProvider p)
   bei Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass12_0.<RealizeService>b__0(ServiceProvider provider)
   bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
   bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService[T](IServiceProvider provider)
   bei Microsoft.Data.Entity.Design.Internal.DesignTimeServicesBuilder.Build(DbContext context)
   bei Microsoft.Data.Entity.Design.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   bei Microsoft.Data.Entity.Commands.Program.Executor.<>c__DisplayClass7_0.<UpdateDatabase>b__0()
   bei Microsoft.Data.Entity.Commands.Program.Executor.Execute(Action action)
No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.

Ahora intenté cambiar el constructor de mi ApplicationDbContext según el enlace de la solución que pegué en la parte superior:

Ese es mi código:

Mi ApplicationDbContext.cs está realmente vacío, lo que significa que no he anulado nada.

Mirando la clase base de la clase base, está el constructor sobrecargado con el parámetro DbContextOptions pero no puedo pasar nada de mi constructor.

  //
        // Summary:
        //     Initializes a new instance of Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext.
        //
        // Parameters:
        //   options:
        //     The options to be used by a Microsoft.Data.Entity.DbContext.
        public IdentityDbContext(DbContextOptions options);

¿Qué se rompe en mi costado? Estoy usando EF 7 RC1 y dnx 451.

Esto sucede solo cuando mueve el objeto ApplicationDbContext / ApplicationUser y toda la carpeta de Migraciones a un proyecto adicional que permite decir "DataAccess". Entonces todo parece roto.

Respuesta aceptada

  1. Cree una nueva aplicación web ASP.NET llamada "WebProject" usando la plantilla de aplicación web (Autenticación: Cuenta de usuario individual).

  2. Ahora agregue otro proyecto a la solución llamada "DataAccess" (digamos que el tipo de biblioteca de clases no es relevante)

  3. Ahora mueva la carpeta ApplicationDbContext / ApplicationUser files & migrations al proyecto DataAccess.

  4. En esta etapa, la construcción fallará, por lo que debemos corregir el proyecto.json para obtener las referencias correctas.

  5. Para el proyecto DataAccess, agregue las siguientes dependencias

    "dependencies": {
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
        "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
    }
    
  6. Para WebProject, agregue DataAccess como dependencia. Dado que DataAccess tiene referencias a los 2 paquetes anteriores, puede eliminar esas referencias de WebProject.
    La compilación debería tener éxito ahora y puede iniciar la aplicación web.

Cómo utilizar las migraciones ef:

En la línea de comandos, vaya al directorio de WebProject (y no al proyecto DataAccess). Todos los comandos ef funcionarán bien desde aquí.

Para agregar nuevas migraciones a la carpeta Migraciones del proyecto DataAccess, debe usar el indicador -p . Me gusta,
dnx ef migrations add Sample -p DataAccess .

El problema surge porque los comandos se ejecutan desde cmd dentro del proyecto DataAccess. Su clase de inicio que está inicializando todos los servicios está en WebProject. Cuando intente ejecutar comandos desde el directorio de dnx ef , se reconocerá dnx ef ya que se hace referencia a EntityFramework.Commands pero cuando intenta usar las migraciones, los servicios no se inicializan, por lo tanto, fallará el lanzamiento de la excepción.


Respuesta popular

Intente mover su clase de contexto a su proyecto "DataAccess" y anule el método OnConfiguring de su contexto en su proyecto "DataAccess" y luego ejecute la migración.

public partial class MyContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
    }
}

O puede hacer lo siguiente si no quiere codificar su cadena de conexión. DI le inyectará las opciones;

public partial class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options) : base(options)
    {

    }
}

y en su Startup.cs;

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddEntityFramework()
        .AddSqlServer()            
        .AddDbContext<WtContext>(options =>
            options.UseSqlServer(Configuration["Data:MyDb:ConnectionString"]));
}

y su appsetting.json;

{
  "Data": {
    "MyDb": {
      "ConnectionString": "**********"
    }
  }
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué