EF Migrations configuration.cs中的种子方法未被调用

时间:2015-05-13 17:46:30

标签: c# entity-framework ef-code-first code-first ef-migrations

我面临EF迁移的奇怪问题。我已经为MVC网站启用了它,并且Migrations文件夹有2个资产 -            - _InitialMigration(这是我项目的基本代码第一个模型)            - Configuration.cs(我需要这里的种子方法来启动新的数据库创建)

这在我启用EF迁移的计算机上按预期工作。但是在将代码检入TFS之后。在任何其他机器上,Seed方法永远不会触发。我确保这些机器上没有DB的痕迹。当项目运行并且Configuation.cs中的构造函数被触发时,将创建数据库模式。然而,Seed()方法永远不会触发。我可以在任何其他计算机上运行的唯一方法是手动运行“添加迁移初始化”#39;从每个这些机器上的包管理器控制台导致更新现有的_Initial.cs迁移文件并将其检出。在此之后,如果刚刚创建了DB,则种子方法将成功运行。

在我的Global.asax中我有以下代码

Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());
using (var context = new Context())
{
    context.Database.Initialize(true);
}

Configuration.cs如下

public sealed class Configuration : DbMigrationsConfiguration<Context>
{
    private bool pendingMigrationsExist;
    private Seeder seeder;

    public Configuration()
    {
        // This ensures a schema diff. is always performed and automatic updates take place.
        AutomaticMigrationsEnabled = true;

        // This is required to detect changes.
        pendingMigrationsExist = new DbMigrator(this).GetPendingMigrations().Any();            
    }

    protected override void Seed(Context context)
    {            
        // Only if a diff exists should migrations be performed.
        if(!pendingMigrationsExist)
        {
            return;
        }

        // Initialize Seeding routine and populate the target DB.
        seeder = new Seeder(context);
        seeder.Seed();
    }        
}

2 个答案:

答案 0 :(得分:1)

想出来。我需要这个小片段

public Configuration()
    {
        // This ensures a schema diff. is always performed and automatic updates take place.
        AutomaticMigrationsEnabled = true;

        var dbMigrator = new DbMigrator(this);

        // This is required to detect changes.
        pendingMigrationsExist = dbMigrator.GetPendingMigrations().Any();

        if (pendingMigrationsExist)
        {
            dbMigrator.Update();
        }

    }

显式调用更新了它。本文深入介绍了这些场景:http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

答案 1 :(得分:0)

我不确定你的pendingMigrationsExist旗帜的用途是什么。运行任何迁移时都会调用Seed方法 - 如果没有运行迁移,则不会调用它。

检查此标志是否阻止种子方法运行。

此外,我建议您使用显式迁移而不是自动迁移,以便您可以控制迁移的运行。