c# - Cómo agregar una implementación de ''IDesignTimeDbContextFactory<DataContext>'' al proyecto en asp.net-core-2.0
entity-framework-core (10)
Algunas personas dijeron que tienes que cambiar tu clase de Startup.cs, pero no hice nada de eso, solo cambié un poco mi clase de Program.cs
---------- Archivo antiguo --------------
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<MvcMovieContext>();
context.Database.Migrate();
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
----------Archivo nuevo---------
public static void Main(string[] args)
{
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var dbContext = scope.ServiceProvider.GetService<MvcMovieContext>();
//SeeData is a class in my Models folder
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Aquí está la lista de paquetes que he instalado: Paquetes instalados
Estoy usando Entityframework core 2.0. La primera vez que creé exitosamente la base de datos usando el primer código de la estructura de la migración de la migración (comando add-migration y update-database). Ahora, cuando actualizo mis entidades e intento ejecutar la migración, me está dando el siguiente error.
No se puede crear un objeto de tipo ''DataContext''. Agregue una implementación de ''IDesignTimeDbContextFactory'' al proyecto, o consulte https://go.microsoft.com/fwlink/?linkid=851728 para ver patrones adicionales admitidos en el momento del diseño.
Aquí está mi código ...
Program.cs
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
Startup.cs
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Repositories
services.AddMvc();
services.AddDbContextPool<DataContext>(
options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
//options => options.UseSqlServer(@"Server=LAPTOP-518D8067;Database=Gyanstack;Trusted_Connection=True;MultipleActiveResultSets=true"));
services.AddCors();
services.AddScoped<ISectionRepository, SectionRepository>();
services.AddScoped(typeof(IEntityBaseRepository<>), typeof(EntityBaseRepository<>));
}
DataContext.cs
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{ }
public DbSet<Section> Section { get; set; }
public DbSet<SubSection> SubSection { get; set; }
public DbSet<Article> Article { get; set; }
public DbSet<Comment> Comment { get; set; }
public DbSet<User> User { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.AddConfiguration(new SectionMap());
modelBuilder.AddConfiguration(new SubSectionMap());
modelBuilder.AddConfiguration(new ArticleMap());
modelBuilder.AddConfiguration(new CommentMap());
}
}
EDIT: ahora obsoleto. Microsoft actualizó su documento de migración a fines de septiembre para mostrar cómo actualizar, por lo que no necesita esta solución.
Como se vio en este problema que mencioné en github , mueve el código de inicialización de su base de datos a la página principal del Programa, colocándolo entre BuildWebHost () y .Run ()
Es relativamente fácil una vez que entiendes que necesitas obtener el contexto de base de datos utilizando var context = services.GetRequiredService<MyContext>();
En Main y luego todo funciona como se espera. (aunque sigo pensando que la inicialización de DB es una cosa de inicialización única, no una cosa que se ejecuta en todos los programas)
El problema es que siembra db desde Startup.Configure ... todavía puede hacerlo con esta solución alternativa. Probado y trabajado bien
En proyectos 2.0, mueva la llamada SeedData.Initialize
al método Main
de Program.cs :
var host = BuildWebHost(args);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services, "").Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
Referencia: https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#move-database-initialization-code
Esto está relacionado con el nuevo proceso de inicio de .NET Core 2.0, en el cual la configuración se maneja de manera diferente (detalles here ).
Si actualizó desde 1.x, modifique su Program.cs
y Startup.cs
:
public class Program
{
public static void Main(String[] args)
{
Program.BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(String[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseUrls("http://*:8000")
.UseStartup<Startup>()
.Build();
}
public class Statup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
........
}
Después de esta modificación, sus migraciones deberían funcionar y no hay necesidad de implementar IDesignTimeDbContextFactory
.
Para mí hice la clase my DBContext con Constructor Injection y le di este error. Volví a tener un constructor sin parámetros que funciona.
Parece que EF 2.0 no funciona con "datos de muestra" que se conservan de la antigua plantilla de red del proyecto. Me las arreglé para deshacerme de este error simplemente comentando la siguiente línea:
SampleData.Initialize(app.ApplicationServices);
Yo creo que
var context = serviceProvider.GetService<ApplicationDbContext>();
context.Database.Migrate();
Casos de este error. No estoy seguro de si esta corrección es correcta pero funciona.
Simplemente cambió mi Program.cs
de esto
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
a esto
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
Fuente: https://wildermuth.com/2017/07/06/Program-cs-in-ASP-NET-Core-2-0
Tuve el mismo problema en el último .Net Core 2.0.3 . Tengo un proyecto separado con implementación de dbContext (desde mi interfaz personalizada IUnitOfWork ), y al principio, la migración funcionó perfectamente. Pero después de haber implementado alguna otra infraestructura, recibí el error similar:
No se puede crear un objeto de tipo ''TestCoreUnitOfWork''. Agregue una implementación de ''IDesignTimeDbContextFactory'' al proyecto, o consulte https://go.microsoft.com/fwlink/?linkid=851728 para ver patrones adicionales admitidos en el momento del diseño.
La solución sugerida sobre la implementación IDesignTimeDbContextFactory está bien, pero me preguntaba por qué las migraciones han funcionado antes. He pasado pocas horas, para descubrir, qué cambio de código fue la interrupción de la migración. Y resultó que fue la inicialización de bootstrappers, donde he cargado todos los ensamblados referenciados (a través de Assembly.Load () ) desde mi solución. Después de cambiar esto a una forma más tradicional con la llamada directa de todos los bootstrappers, la migración comenzó a funcionar nuevamente.
Para resumir y responder a la pregunta, la única razón posible del error de migración es utilizar Assembly.Load () en StartUp.ConfigureServices () .
Espero que sea de utilidad para alguien.
Me encontré con este error mientras utilizaba Npgsql.EntityFrameworkCore.PostgreSQL, si es importante.
Teniendo en cuenta https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#add-configuration-providers
Agregué esto a BuildWebHost ()
.ConfigureAppConfiguration((hostContext, config) =>
{
// delete all default configuration providers
config.Sources.Clear();
config.AddJsonFile("appsettings.json", optional: true);
})
así que bacame:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((hostContext, config) =>
{
// delete all default configuration providers
config.Sources.Clear();
config.AddJsonFile("appsettings.json", optional: true);
})
.Build();
Ahora funciona