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

C# 未调用EF Migrations configuration.cs中的种子方法,c#,entity-framework,ef-code-first,code-first,entity-framework-migrations,C#,Entity Framework,Ef Code First,Code First,Entity Framework Migrations,我在EF迁移方面遇到了一个奇怪的问题。我为MVC网站启用了它,迁移文件夹有2个资产- -_InitialMigration(这是我的项目的基本代码优先模型) -Configuration.cs(我需要这里的seed方法在创建新数据库时启动) 这在我启用EF迁移的机器上正常工作。但是,在将代码签入TFS之后。在任何其他机器上,种子方法都不会激发。我已经确保这些机器上没有DB的痕迹。当项目运行并触发Configuation.cs中的构造函数时,将创建DB模式。但是Seed()方法从不激发。我能在任何

我在EF迁移方面遇到了一个奇怪的问题。我为MVC网站启用了它,迁移文件夹有2个资产- -_InitialMigration(这是我的项目的基本代码优先模型) -Configuration.cs(我需要这里的seed方法在创建新数据库时启动)

这在我启用EF迁移的机器上正常工作。但是,在将代码签入TFS之后。在任何其他机器上,种子方法都不会激发。我已经确保这些机器上没有DB的痕迹。当项目运行并触发Configuation.cs中的构造函数时,将创建DB模式。但是Seed()方法从不激发。我能在任何其他机器上实现此功能的唯一方法是在每台机器上的package manager控制台上手动运行“Add Migration Initial”,这会更新现有的_Initial.cs迁移文件并将其签出。在此之后,如果刚刚创建数据库,则seed方法将成功运行

在my Global.asax中,我有以下代码

Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());
using (var context = new Context())
{
    context.Database.Initialize(true);
}
Database.SetInitializer(新的MigrateDatabaseToLatestVersion());
使用(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();
    }        
}
公共密封类配置:dbmigtorinsconfiguration
{
存在私人布尔悬而未决的迁移;
私人播种机;
公共配置()
{
//这可确保始终执行架构差异,并进行自动更新。
AutomaticMiggerationsEnabled=真;
//这是检测更改所必需的。
pendingMigrationsExist=新的DbMigrator(this).GetPendingMigrations().Any();
}
受保护的覆盖无效种子(上下文)
{            
//仅当存在差异时才应执行迁移。
如果(!PendingMigrationExist)
{
返回;
}
//初始化种子设定例程并填充目标数据库。
播种机=新播种机(上下文);
播种机;
}        
}

我不确定您的
PendingMigrationExist
标志的目的是什么。运行任何迁移时都会调用Seed方法-如果未运行任何迁移,则不会调用Seed方法

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


此外,我建议您使用显式迁移而不是自动迁移,这样您就可以控制运行什么迁移了。

解决了这个问题。我需要这个小片段

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();
        }

    }

对update的显式调用实现了这一点。本文深入讨论了这些场景:

该标志的目的是,即使在数据库已经存在之后,即使没有差异,seed方法也将始终激发,并且我的数据将被复制。然而,这是种子方法实际激发的情况。在我所指的其他机器上,它从不点火。此外,无论该标志如何,代码都不会进入Configuration.cs的“Seed”方法。这是我想弄明白的核心问题。另外,当你说显式迁移时,我假设你每次都是指使用“更新数据库”?我确实定义了一个名为“Initial”的显式基本迁移,每次在不存在DB的环境中执行应用程序时都会运行该迁移。每次进行更改时,我都会添加另一个迁移文件,但需要在代码中进行更新,以便部署到其他环境。我认为
MigrateDatabaseToLatestVersion
会创建
DbMigrator
的实例,并调用
update
。另外,
配置
是在
MigrateDatabaseToLatestVersion
构造函数期间构造的。对,但由于某种原因,seed方法在我像上面那样显式调用它之前不会启动。我仍在试图弄清楚我是否在这里的流中遗漏了任何其他内容。好吧,这段代码实际上不起作用,因为它将强制在递归循环中调用配置构造函数,并作为结果-堆栈溢出-)。尝试在没有DB的情况下运行您的项目-您将看到。