Entity framework EF5代码优先迁移-DB Init反复运行

Entity framework EF5代码优先迁移-DB Init反复运行,entity-framework,ef-code-first,entity-framework-migrations,Entity Framework,Ef Code First,Entity Framework Migrations,我的新EF5 Code First应用程序出现了这种奇怪的情况,它利用了新的迁移支持。我看到的一件事是,数据库种子设定例程在初始DB负载上运行,但奇怪的是,它似乎在应用程序一段时间没有运行后再次运行。这是意料之中的事吗?防止这种情况发生的最好办法是什么 我得到了整个.AddOrUpdate(),但与应用程序第一次运行并创建DB模式时相比,让它运行得更多似乎有些奇怪。想法?是的,这是预期的行为。即使没有要应用的架构更改,Seed方法也会运行 如果您在Seed方法中有大量工作要做,并且需要更多的控制

我的新EF5 Code First应用程序出现了这种奇怪的情况,它利用了新的迁移支持。我看到的一件事是,数据库种子设定例程在初始DB负载上运行,但奇怪的是,它似乎在应用程序一段时间没有运行后再次运行。这是意料之中的事吗?防止这种情况发生的最好办法是什么


我得到了整个.AddOrUpdate(),但与应用程序第一次运行并创建DB模式时相比,让它运行得更多似乎有些奇怪。想法?

是的,这是预期的行为。即使没有要应用的架构更改,Seed方法也会运行

如果您在Seed方法中有大量工作要做,并且需要更多的控制,您可以执行类似于向项目的.config文件添加应用程序设置的操作:

<appSettings>
    <add key="seedDatabase" value="true"/>
</appSettings>

我的理解是,在配置中将
AutomaticMigrationsEnabled
设置为true将在每次应用程序启动时触发迁移(这可能就是为什么当应用程序一段时间没有运行时,您会看到这种行为)

问题是,即使没有任何东西要迁移,迁移代码也会运行seed。我会使用类似于@OdeToCode的解决方案,但我更希望使用DB本身完成检查(比如测试表是否为空等等)

实际上,新的
Enable Migrations
命令将在生成的
Configuration.cs
文件中将
AutomaticMigrationsEnabled
设置为false


初始化器确实是设置DB的另一种形式,正如您正确地说的,它们在测试/原型环境中更有用,允许您每次将DB重置为已知状态。它看起来像是重复的功能,但用途不同:在生产数据库中,我不会使用预烘焙的初始值设定项。

您将数据库种子设定放在哪里了?每次迁移数据库时,迁移中的种子设定都会再次运行。种子设定是从我的Configuration.Seed()方法调用的,并在构造函数中将AutomaticMigrationsEnabled属性设置为true。我理解同样的事情(它们是在数据库迁移时运行的),但不理解为什么每次架构没有更改时都会迁移(只通过_Migrations表中的一条记录进行验证)。我注意到Azure上也有同样的行为。奇怪的是.AddOrUpdate似乎不应该插入相同的记录(不同之处在于sql在插入记录时自动为它们创建的PK ID)。所以。。。我有点把他们弄糊涂了。他们的起首字母是什么?如果seed一直在运行,那么初始化者似乎被seed方法欺骗了……这是令人困惑的,部分原因是在迁移之前初始化者就已经存在了。但是,初始值设定项总是针对给定的上下文类型运行,并且可以删除和创建数据库。我认为迁移更面向模式,只有当您告诉迁移运行时才会运行迁移,比如从PM控制台使用更新数据库,或者使用MigrateDatabaseTolatesVersion初始值设定项,因为它是一个初始值设定项,所以始终会运行迁移。如果我使用迁移,我不会从初始值设定项开始。希望这是有意义的。因此,在我看来,对于代码优先迁移,初始化器唯一真正的用途是用于自动化测试,您可以轻松地删除和重新设置数据库种子。否则,看起来像是被欺骗的功能。。。对吗?
protected override void Seed(BarDb context)
{
    if(ConfigurationManager.AppSettings["seedDatabase"] == "true")
    {
        // ... seed logic
    }            
}