实体框架CompatibleWithModel(true)返回负假

时间:2016-04-21 04:12:15

标签: c# entity-framework entity-framework-6 ef-migrations

我将EF从DB迁移到Code First。 到目前为止,除了一个奇怪 初始DB包含视图和存储的函数和过程。 只需使用现有数据库切换到EF Code First方法就可以了。

但是如果不存在则创建新数据库会导致一些问题。

  • 自动迁移已关闭。
  • 添加了初始迁移到创建数据库,修改了UP方法以使用this.Sql()方法创建存储的函数/过程和视图。
  • 下一步修改了上下文构造函数:

        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的模型值。

    结果正确的申请工作。

0 个答案:

没有答案