我的新EF5 Code First应用程序正在利用新的迁移支持来解决这个奇怪的事情。我看到的一件事是数据库种子例程正在初始数据库加载上运行,但奇怪的是它似乎在应用程序暂时没有运行后再次运行。这是预期的吗?什么是阻止这种情况发生的最好方法?
我得到了整个.AddOrUpdate(),但是当应用程序第一次运行并创建数据库模式时,运行起来仍然很奇怪。想法?
答案 0 :(得分:2)
是的,这是预期的行为。即使没有要应用的架构更改,Seed方法也会运行。
如果您在Seed方法中进行大量工作并希望获得更多控制权,则可以执行类似向项目的.config文件添加应用设置的操作:
<appSettings>
<add key="seedDatabase" value="true"/>
</appSettings>
然后检查Seed方法中的设置。
protected override void Seed(BarDb context)
{
if(ConfigurationManager.AppSettings["seedDatabase"] == "true")
{
// ... seed logic
}
}
答案 1 :(得分:0)
我的理解是,在配置中将AutomaticMigrationsEnabled
设置为true,每次App Start时都会触发迁移(这可能就是为什么当应用程序运行一段时间后你就会看到这种行为的原因)。
问题是,即使没有任何要迁移的内容,迁移代码也会运行种子。我会使用类似于@OdeToCode的解决方案,但我宁愿使用数据库本身来完成我的检查(如果表是空的等测试,等等。)
实际上,新的Enable-Migrations
命令会在生成的AutomaticMigrationsEnabled
文件中将Configuration.cs
设置为false。
初始化程序确实是设置数据库的另一种形式,正如您所说,它们在测试/原型设计上下文中更有用,它允许您每次将数据库重置为已知状态。它看起来像重复的功能,但目的不同:在生产数据库中,我不会使用其中一个预先准备好的初始化程序。