这个问题已被问过几次,但没有一个解决方案/文档适用于我。
场景 - 我需要从头开始构建一个数据库并使用代码进行迁移编辑,根据下面的行文档应该从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()不应该创建表以及数据库吗?
注意 - 在测试中,我在尝试其他方法之前删除数据库。
答案 0 :(得分:3)
另一个经典案例是在一两天内挣扎,但在这里发帖后半小时才能找到答案。发布我的解决方案,其他人也有类似的问题。
TLDR - _dbContext.Database.Migrate();
不会创建迁移。
基本上,dbContext.Database.EnsureCreated()
并不关心迁移,这就是它生成完整数据库inc表的原因(但当然你无法迁移)。
_dbContext.Database.Migrate();
应用迁移并创建数据库(如果它不存在),但如果没有迁移则不创建表。
基本上我有一个项目作为资源,我试图从用户生成的新应用程序复制项目,但因为我从未在资源项目中运行任何迁移,所以没有任何迁移。在资源项目中运行PMC中的Add-Migration Initial
为项目提供了初始迁移文件,因此当我在新数据库上运行迁移时,它知道要创建哪些表。
答案 1 :(得分:-1)
就我而言,我有多个项目,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"));
});