我将EF从DB迁移到Code First。 到目前为止,除了一个奇怪 初始DB包含视图和存储的函数和过程。 只需使用现有数据库切换到EF Code First方法就可以了。
但是如果不存在则创建新数据库会导致一些问题。
下一步修改了上下文构造函数:
if (Database.Exists() == false)
{
Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
}
else
{
if (Database.CompatibleWithModel(true) == false)
{
Database.SetInitializer<MyDbContext>(new Initializers.MyDbContextInitializer());
}
else
{
Database.SetInitializer<MyDbContext>(null);
}
}
Database.Initialize(false);
这就是魔术。在初始迁移运行并创建DB之后 这个例子说:
无法更新数据库以匹配当前模型,因为有 挂起的更改和自动迁移已禁用。要么写 待定模型更改为基于代码的迁移或启用自动 移民。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为 如果启用自动迁移,则为true您可以使用添加迁移 命令将挂起的模型更改写入基于代码的迁移。 CompatibleWithModel(true)返回负false。调查 在调试器周围和下面只需将下一个语句设置为else部分(如 如果模型兼容)并且每件事都运作良好。
在软件包管理器控制台中:添加迁移MissingStuff 创建仅为每个密钥DB重新创建外键的迁移。
Up()
{
...
DropForeignKey("dbo.MST_UserRegion", "RegionID", "dbo.MST_Region");
AddForeignKey("dbo.MST_UserRegion", "RegionID", "dbo.MST_Region", "RegionID");
...
}
Down()
{
...
DropForeignKey("dbo.MST_UserRegion", "RegionID", "dbo.MST_Region");
AddForeignKey("dbo.MST_UserRegion", "RegionID", "dbo.MST_Region", "RegionID", cascadeDelete: true);
...
}
此外生成的Down()错误并导致错误,因为FK最初在初始迁移Up()方法中创建为“NO action”。 例如:
CreateTable(
"MST_UserRegion",
c => new
{
UserRegionID = c.String(nullable: false, maxLength: 20),
RegionID = c.Int(nullable: false),
UserId = c.Int(nullable: false),
})
.PrimaryKey(t => t.UserRegionID)
.ForeignKey("MST_Region", t => t.RegionID, cascadeDelete: false)
.ForeignKey("MST_User", t => t.UserId, cascadeDelete: false)
.Index(t => t.RegionID)
.Index(t => t.UserId);
所以FKs不是问题,因为第二次迁移确实没什么。 我怀疑是EF为包含Up.Sis方法使用此版本的迁移生成错误的迁移哈希值(@“CRATE VIEW XXX AS ...”)
作为解决方法我可以简单地从生成的第二次迁移的Up和Down方法中删除任何代码并运行它以使上下文哈希与__MigrationHistory表中的Hash匹配。
如果有人遇到同样的问题,请分享一下吗?只是想知道我怀疑使用Migration.Sql()方法是否正确。可能是我做错了什么?
提前致谢。
更新 如果在DB创建之后忽略if的结果(Database.CompatibleWithModel(true)== false)并强制执行Database.SetInitializer(null);它按预期工作,没有错误。所以真正的问题是Database.CompatibleWithModel()结果。
UPDATE2:
使用第一步中保存的值手动更新__MigrationHistory的模型值。
结果正确的申请工作。