如何添加'IDesignTimeDbContextFactory<数据上下文>'到asp.ne



以下是我安装的软件包列表:installed packages

我使用的是Entityframework核心2.0。我第一次使用实体框架代码第一次迁移(添加迁移和更新数据库命令)成功创建数据库。现在,当我更新实体并尝试运行迁移时,会出现以下错误。

无法创建"DataContext"类型的对象。将"IDesignTimeDbContextFactory"的实现添加到项目中,或参阅https://go.microsoft.com/fwlink/?linkid=851728用于设计时支持的其他模式。

这是我的密码。。。

程序.cs

public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();

启动.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:现已过时。微软在9月底更新了他们的迁移文档,展示了如何更新,这样你就不需要这个解决方案了。

正如我在github上提出的这个问题所看到的,您将DB初始化代码移动到Program main,将其放在BuildWebHost()和.Run()之间

一旦您理解了需要使用var context = services.GetRequiredService<MyContext>();,然后一切按预期工作。(尽管我仍然认为DB初始化是一次性的初始化,而不是每次程序运行的事情)

简单地更改了我的程序.cs

从这个

public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}

到这个

public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}

来源:https://wildermuth.com/2017/07/06/Program-cs-in-ASP-NET-Core-2-0

对我来说,我用Constructor Injection创建了我的DBContext类,它给出了这个错误。我恢复到使用无参数构造函数。

在2.0项目中,将SeedData.Initialize调用移动到Program.cs:的Main方法

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();   

参考:https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#move-数据库初始化代码

我在最新的.Net Core 2.0.3上遇到了同样的问题。我有一个单独的项目,实现了dbContext(来自我的自定义界面IUnitOfWork),起初-迁移工作非常完美。但在我实现了一些其他基础设施之后,我也出现了类似的错误:

无法创建"TestCoreUnitOfWork"类型的对象。添加将"IDesignTimeDbContextFactory"实现为项目,或参见https://go.microsoft.com/fwlink/?linkid=851728对于设计时支持的其他模式。

关于实现的建议解决方案IDesignTimeDbContextFactory很好,但我想知道为什么以前迁移有效?我花了几个小时,想弄清楚,哪一个代码更改是破坏迁移的。事实证明,这是引导程序的初始化,我已经从我的解决方案中加载了所有引用的程序集(通过Assembly.load())。在我通过所有引导程序的直接调用将这种方式改为更传统的方式后,迁移又开始工作了。

总结并回答这个问题,一个可能是迁移错误的原因-在StartUp.ConfigureServices().中使用Assembly.Load()

我希望它对某人有用。

问题在于从Startup播种数据库。Configure…您仍然可以通过这种方法来完成。测试工作良好

https://garywoodfine.com/how-to-seed-your-ef-core-database/

看起来EF 2.0不适用于项目旧网络核心模板中保留的"样本数据"。我设法摆脱了这个错误,只是评论下一行:

SampleData.Initialize(app.ApplicationServices);

我认为

var context = serviceProvider.GetService<ApplicationDbContext>();
context.Database.Migrate();

如果出现此错误。我不确定这个修复是否正确,但它有效。

这与.NET Core 2.0的新init进程有关,在该进程中,配置的处理方式有所不同(详细信息请参阅此处)。

如果您从1.x升级,请修改您的Program.csStartup.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; }
........
}

修改之后,您的迁移应该可以工作,并且不需要实现IDesignTimeDbContextFactory

如果重要的话,我在使用Npgsql.EntityFrameworkCore.PostgreSQL时遇到了这个错误

考虑https://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#add-配置提供商

我将此添加到BuildWebHost()

.ConfigureAppConfiguration((hostContext, config) =>
{
// delete all default configuration providers
config.Sources.Clear();
config.AddJsonFile("appsettings.json", optional: true);
})

所以它的名字是:

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();

现在它工作

有些人说你必须更改Startup.cs类,但我并没有这样做,只是稍微更改了我的Program.cs类

----------旧文件---------------

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>();
}

----------新文件--------

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();
}

[对于2.1.1版本]

我在MyDbContext.cs:中添加了OnConfiguring方法

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
optionsBuilder.UseSqlServer(@"Server(localdb)\mssqllocaldb;Database=MyDataBase;Trusted_Connection=True;MultipleActiveResultSets=truer");
}

最新更新