【问题标题】:Entity Framework Migrations - Seed runs even if no migration?实体框架迁移 - 即使没有迁移,种子也会运行?
【发布时间】:2013-03-12 21:27:07
【问题描述】:

我已经使用AutomaticMigrationsEnabled = false 设置了一个简单的迁移。在 Visual Studio 或使用 MigrateDatabaseToLatestVersion 时,一切都很好。

但是,这对我来说并不理想。我想从我的 ci 服务器上的部署脚本运行迁移。我发现 this article 解释了如何使用 migrate.exe 但是这似乎总是运行种子。即使没有要应用的迁移也是如此。

我是否需要在 Seed 方法中以编程方式检查是否已运行任何迁移?我该怎么做?

【问题讨论】:

  • 为什么不让你的种子幂等?
  • @LukeMcGregor - 如果我想插入一些数据,我将如何在没有明确硬编码键或在每个表上运行自定义书面检查以进行升级的情况下做到这一点?
  • 我个人对种子数据的密钥进行硬编码,因为它的种子无论如何都是静态的 IMO

标签: entity-framework database-migration


【解决方案1】:

仅当存在待处理的迁移时,才使用 DbMigrator 手动运行 Update()。它是在 Entity Framework 5.0 中引入的。

private void MigrateAndSeedDbIfSchemaIsOutdated()
{
    // Disable initializer.
    Database.SetInitializer<MyContext>(null);

    // Make sure database exists.
    using (var db = new MyContext())
    {
        db.Database.Initialize(false);
    }

    var migrator = new DbMigrator(new MyConfiguration());

    if (migrator.GetPendingMigrations().Any())
    {
        // Run migrations and seed.
        migrator.Update();
    }
}

【讨论】:

  • 啊,不知道那个方法谢谢!关于您的 LINQ 的注释 - 无需在此处调用 ToList,您只需将 pendingMigrations 保留为 IEnumerable&lt;&gt; 并在其上调用 .Any()。调用 ToList 会强制整个枚举进行评估,而您只关心其中是否至少有一项。
  • 你说得对,我用那部分来调试。我已经编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 2015-05-11
  • 2013-09-16
  • 2017-08-09
  • 1970-01-01
  • 2020-10-13
相关资源
最近更新 更多