【问题标题】:Database.Migrate() creating database but not tables, EF & .NET Core 2Database.Migrate() 创建数据库但不创建表,EF & .NET Core 2
【发布时间】:2018-05-24 11:01:07
【问题描述】:

这个问题已被问过几次,但没有一个解决方案/文档对我有用。

场景 - 我需要从头开始构建一个数据库并使用所有代码的迁移对其进行编辑,根据文档,下面的行应该从 DbContext/ModelBuilder 创建数据库。

_dbContext.Database.Migrate();

然而,这只是创建数据库本身,并没有创建任何表。如果我改为运行以下命令,

_dbContext.Database.EnsureCreated();

数据库和所有表都已创建,但这不是一个选项,因为我需要通过进一步的迁移进行编辑。我在 Migrate 行之后直接尝试了下面的代码,但 pendingMigrations 始终为 0。

var pendingMigrations = _dbContext.Database.GetAppliedMigrations().ToList();
        if (pendingMigrations.Any())
        {
            var migrator = _dbContext.Database.GetService<IMigrator>();
            foreach (var targetMigration in pendingMigrations)
                migrator.Migrate(targetMigration);
        }

这里有什么我遗漏的吗? Database.Migrate() 不应该在创建表的同时创建数据库吗?

注意 - 在测试中,我会在尝试其他方法之前删除数据库。

【问题讨论】:

  • _dbContext.Database.Migrate(); 应该创建表。它在我的(不仅仅是我猜的)测试中做到了。
  • 找到答案,现在发布

标签: asp.net-core-2.0 database-migration ef-core-2.0


【解决方案1】:

又是一个经典案例,一两天后在此处发布问题后半小时才找到答案。发布我的解决方案以防其他人遇到类似问题。

TLDR - _dbContext.Database.Migrate(); 不会创建迁移。

基本上,dbContext.Database.EnsureCreated() 不关心迁移,这就是它生成完整数据库 inc 表的原因(但是当然你不能迁移)。

_dbContext.Database.Migrate(); 应用迁移并在数据库不存在时创建数据库,但如果没有迁移则不会创建表。

基本上我有一个项目作为资源,我试图从用户生成的新应用程序中复制该项目,但由于我从未在资源项目中运行任何迁移,因此没有什么可迁移的。在资源项目的 PMC 中运行 Add-Migration Initial 为项目提供了初始迁移文件,因此当我在新数据库上运行 migrate 时,它​​知道要创建哪些表。

【讨论】:

  • +1。对我来说,官方文档没有涵盖这一点是深不可测的。男孩,它背后的逻辑!要创建一个新数据库,您需要创建一个迁移并迁移。 /咆哮
【解决方案2】:

就我而言,我有多个项目,DesignTimeDbContextFactory 指向一个 MigrationsAssembly 但在启动时 sqlOptions 没有。

所以当 DI 创建 DbContext 时,它不知道有待处理的迁移。

您可以使用以下命令检查待处理的迁移 dbContext.Database.GetPendingMigrations();Migrate(); 之前检查它是否找到了迁移

解决方案是在sqlOptions 中添加迁移MigrationsAssembly

 services.AddDbContext<BM_OCR_DbContext>(options =>
                {
                    options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection"),
                    sqlServer => sqlServer.MigrationsAssembly("BM.OCR.Server"));
                });

【讨论】:

    【解决方案3】:

    另一种方式 - 在 EF Migration 项目中创建扩展方法。它可以在没有 sqlServer.MigrationsAssembly() 方法的情况下工作。

    namespace Project.Data;
    {
        public static class Extensions
        {
            public static void AddEntityFramework(this IServiceCollection services, IConfiguration configuration)
            {
                var cnn = configuration.GetConnectionString("DefaultConnection");
                services.AddDbContext<AppDbContext>(opt => opt.UseSqlServer(cnn));
            }
        }
    }
    

    然后在 Startup.cs 中使用它

    services.AddEntityFramework(Configuration);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2017-09-26
      • 2022-01-12
      • 2020-12-16
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多