将我的项目从EF Core / Asp.NET Core 1.1.2迁移到2.0.0-preview2-latest以便使用自定义数据库功能支持后,迁移引擎将不再起作用。我已经将CLI工具更新到2.0.0-preview2-final,但它没有解决问题。
这是我的所有Startup.cs和Context代码供参考:
Startup.cs:
NewFoo(owner FooMgrInterface) *Foo
MemoryContext.cs:
{{1}}
控制台输出:
在'MemoryContext'上找不到无参数构造函数。要么添加 “MemoryContext”的无参数构造函数或添加 在'中实现'IDesignTimeDbContextFactory' 与'MemoryContext'相同的程序集。
答案 0 :(得分:2)
在指出Smit的说明后,这是解决问题的正确方法:
由于Asp.NET Core 2发生了变化,迁移工具不能再简单地使用Startup类了。相反,将Program.cs修改为以下内容:
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run();
}
public static IWebHost BuildWebHost(string[] args) =>
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
}
执行此操作后,迁移工具应该能够再次实例化您的上下文,并且您不必对设计时工厂进行硬编码。
答案 1 :(得分:0)
对于EF Core 2.0 RTM,将此类添加到上下文所在的同一项目中:
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{
public MyDbContext CreateDbContext(string[] args)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var builder = new DbContextOptionsBuilder<MyDbContext>();
var connectionString = configuration.GetConnectionString("DefaultConnection");
builder.UseSqlServer(connectionString);
return new MyDbContext(builder.Options);
}
}