无法创建类型为“ MyDbContext”的对象。添加实现“ IDesignTimeDbContextFactory <MyDbContext>”

时间:2019-09-03 16:55:01

标签: entity-framework-core

我刚刚从1.1升级到2.1,然后运行:dotnet ef migrations add spottedmahn,我得到了:

  

无法创建类型为“ MyDbContext”的对象。在项目中添加“ IDesignTimeDbContextFactory”的实现,或在设计时支持https://go.microsoft.com/fwlink/?linkid=851728的其他模式。

1 个答案:

答案 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方法。 ?‍♂️