IDesignTimeDbContextFactory并不总是需要?

时间:2017-09-13 16:42:24

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

以前我必须实现IDesignTimeDbContextFactory才能运行迁移,例如: PM>添加迁移初始化 PM>更新数据库

如果没有,控制台会抛出错误并引导我到这里:https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext#use-idesigntimedbcontextfactory

所以我做了它的建议并让迁移运行起来。 之后我创建了新项目,并且我没有必要实现IDesignTimeDbContextFactory。无论如何,迁移都有效。这怎么可能? 所有项目都使用相同的.NET Core版本(2.0)。

我们是否总是需要创建一个IDesignTimeDbContextFactory,还是只是在某些情况下呢?

谢谢!

2 个答案:

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