以前我必须实现IDesignTimeDbContextFactory才能运行迁移,例如: PM>添加迁移初始化 PM>更新数据库
如果没有,控制台会抛出错误并引导我到这里:https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext#use-idesigntimedbcontextfactory。
所以我做了它的建议并让迁移运行起来。 之后我创建了新项目,并且我没有必要实现IDesignTimeDbContextFactory。无论如何,迁移都有效。这怎么可能? 所有项目都使用相同的.NET Core版本(2.0)。
我们是否总是需要创建一个IDesignTimeDbContextFactory,还是只是在某些情况下呢?
谢谢!
答案 0 :(得分:4)
好的,这里有: 如果您的DbContext中有默认构造函数或使用ASP.NET Core 2.0项目模板中建立的Program.BuildWebHost()模式,则通常不需要IDesignTimeDbContextFactory实现。
在2.0.0-preview1中没有使用Program.BuildWebHost(),你需要一个设计时工厂。
请参阅此主题以获取完整的讨论: https://github.com/aspnet/EntityFrameworkCore/issues/9033
答案 1 :(得分:1)
如Dan Banan所述,如果DbContext
具有默认构造函数,则在设计时将不需要IDesignTimeDbContextFactory
。但是,如果需要从Startup
进行配置,则需要一个接受DbContextOptions<T>
并调用相应的base
构造函数的构造函数。但是,这将带来另一个问题。无论使用哪种构造函数,都将调用DbContext
的{{1}}方法。
要说明这些细节,我发现以下模式很有用:
DbContext配置和依赖项注入
OnConfigure
MyDbContext.cs
serviceCollection
.AddDbContext<MyDbContext>(
options => options.UseSqlServer(configuration.GetConnectionString("MyDb"),
ServiceLifetime.Transient
);