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

Jam*_*son 4 database-migration asp.net-core-2.0 ef-core-2.0

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

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

_dbContext.Database.Migrate();
Run Code Online (Sandbox Code Playgroud)

然而,这只是创建数据库本身而不是任何表。如果我运行下面的命令,

_dbContext.Database.EnsureCreated();
Run Code Online (Sandbox Code Playgroud)

数据库和所有表都已创建,但这不是一个选项,因为我需要进一步编辑迁移。我在 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);
        }
Run Code Online (Sandbox Code Playgroud)

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

注意 - 在测试中,我在尝试另一种方法之前删除了数据库。

Jam*_*son 8

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

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

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

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

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


han*_*nan 6

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

在此输入图像描述 在此输入图像描述

因此,当 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"));
                });
Run Code Online (Sandbox Code Playgroud)