【问题标题】:In EF Core, how to check whether a migration is needed or not?在 EF Core 中,如何检查是否需要迁移?
【发布时间】:2026-01-04 12:10:01
【问题描述】:

我在 Xamarin.iOS 应用程序中使用 Entity Framework Core。

在包含 iOS 应用程序和其他应用程序之间共享的代码 (.netstandard 2.0) 的核心项目中,我想知道是否需要迁移,以便我也可以执行一些其他操作。

这里是上下文:

public void Initialize()
{
   using (var dbContext = new MyDbContext(m_dbContextOptions))
   {
       --> bool isNeeded = demoTapeDbContext.Database.IsMigrationNeeded()

       demoTapeDbContext.Database.Migrate();
   }
}

我发现最接近的方法是调用方法 GetPendingMigrationsAsync() 并检查待处理迁移的数量,但我不确定这是否是在实体框架中进行此类检查的最安全方法:

public async Task InitializeAsync()
{
   using (var dbContext = new MyDbContext(m_dbContextOptions))
   {
       bool isMigrationNeeded = (await demoTapeDbContext.Database.GetPendingMigrationsAsync()).Any();

       demoTapeDbContext.Database.Migrate();
   }
}

【问题讨论】:

    标签: c# .net-standard ef-core-2.1


    【解决方案1】:

    你是正确的,GetPendingMigrationsAsync 方法是你应该使用的。来自the docs

    异步获取程序集中定义但尚未应用到目标数据库的所有迁移。

    如果您查看the code,您可以追踪它是如何工作的。 If 获取程序集中定义的所有迁移,并通过查询数据库删除它找到的迁移。

    【讨论】:

      【解决方案2】:

      我在DbInitializer中使用以下代码:

      public static class DbInitializer
      {
          public static void Initialize(ApplicationDbContext context)
          {
      
              if(context.Database.GetPendingMigrations().Any()){
                  context.Database.Migrate();
              }
              ...
      

      【讨论】:

      • 在代码中,我们只有 context.Database.Migrate();,它在我们的应用程序的 1 个实例上运行良好,但现在我们需要 2 个实例,并且我们面临应用程序无法插入重复迁移的错误。可能我们正面临这个错误,因为部署后的两个实例都试图执行相同的迁移。此检查context.Database.GetPendingMigrations().Any()) 是否也可以修复该错误?这是否可以解决我面临的问题,问题是我们水平扩展了我们的应用程序