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:

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

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

  services.AddScoped<TestRepository, TestRepository>();

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.

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

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

  services.AddScoped<TestRepository, TestRepository>();

¿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
{
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        options.UseSqlServer(@"Server=****;Database=***;user id=***;password=***");
    }
}

y en su Startup.cs;

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

y su appsetting.json;

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



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é