我面临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();
}
}
答案 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方法 - 如果没有运行迁移,则不会调用它。
检查此标志是否阻止种子方法运行。
此外,我建议您使用显式迁移而不是自动迁移,以便您可以控制迁移的运行。