我刚刚从1.1升级到2.1,然后运行:dotnet ef migrations add spottedmahn
,我得到了:
无法创建类型为“ MyDbContext”的对象。在项目中添加“ IDesignTimeDbContextFactory”的实现,或在设计时支持https://go.microsoft.com/fwlink/?linkid=851728的其他模式。
答案 0 :(得分:1)
您需要在IWebHost BuildWebHost(string[] args)
中定义IWebHostBuilder CreateWebHostBuilder(string[] args)
或Program
。
方法名称很重要(我有CreateWebHost
,但失败了。)
对我来说,“将'IDesignTimeDbContextFactory的实现添加到项目中”是red herring。它找不到我的IWebHostBuilder
,因此无法使用为我的ServiceProvider
配置的DbContext
。使用accepted answer here对某些人可能有效,但对我来说却违反了DRY。
使用this answer以详细模式进行迁移:dotnet ef migrations add spottedmahn -v
:
正在查找DbContext类...
正在查找IDesignTimeDbContextFactory实现...
正在寻找应用服务提供商...
正在查找IWebHost访问器...
在类型“ MyApp.Web.Program”上未找到没有CreateWebHostBuilder(string [])方法。 找不到应用程序服务提供商。
在项目中找到DbContext类...
找到了DbContext'MyDBContext'。
Microsoft.EntityFrameworkCore.Design.OperationException:无法创建类型为“ MyDBContext”的对象。将“ IDesignTimeDbContextFactory”的实现添加到项目中,或者在设计时参见https://go.microsoft.com/fwlink/?linkid=851728,以了解其他受支持的模式。 ---> System.MissingMethodException:没有为此对象定义无参数的构造函数。
然后我注意到“未找到CreateWebHostBuilder ...”。经过一些试验,我了解到这些代码段中的任何一个都是有效的。
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
或
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
The doc page仅指BuildWebHost
方法,但是详细日志指的是CreateWebHostBuilder
方法。 ?♂️