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

问题描述 投票:1回答:2

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

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

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

asp.net-core-2.0 database-migration ef-core-2.0
2个回答
3
投票

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

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

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

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

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


-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"));
                });
© www.soinside.com 2019 - 2024. All rights reserved.