迁移到2.0.0预览后找不到无参数构造函数

时间:2017-07-30 03:32:23

标签: c# asp.net-core entity-framework-core asp.net-core-2.0

将我的项目从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'相同的程序集。

2 个答案:

答案 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);
    }
}