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() 不应该同时创建表和数据库吗?
注意 - 在测试中,我在尝试另一种方法之前删除了数据库。
另一个典型的案例是在此处发布问题后半小时才找到答案一两天。发布我的解决方案,以防其他人遇到类似问题。
TLDR -_dbContext.Database.Migrate();
不创建迁移。
基本上,dbContext.Database.EnsureCreated()
不关心迁移,这就是它生成完整数据库 inc 表的原因(但是当然你不能迁移)。
_dbContext.Database.Migrate();
如果数据库不存在,则应用迁移并创建数据库,但如果没有迁移,则不会创建表。
基本上我有一个项目作为资源,我试图从用户生成的新应用程序中复制该项目,但由于我从未在资源项目中运行任何迁移,因此没有什么可迁移的。Add-Migration Initial
在资源项目的 PMC 中运行该项目为该项目提供了初始迁移文件,因此当我在新数据库上运行 migrate 时,它知道要创建哪些表。
就我而言,我有多个项目,并且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)
归档时间: |
|
查看次数: |
4432 次 |
最近记录: |