Database.Migrate()创建数据库但不创建表,EF& .NET Core 2

时间:2018-05-24 11:01:08

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

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

场景 - 我需要从头开始构建一个数据库并使用代码进行迁移编辑,根据下面的行文档应该从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()不应该创建表以及数据库吗?

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

2 个答案:

答案 0 :(得分:3)

另一个经典案例是在一两天内挣扎,但在这里发帖后半小时才能找到答案。发布我的解决方案,其他人也有类似的问题。

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

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

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

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

答案 1 :(得分:-1)

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

enter image description here enter image description here

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

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

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

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