EF Code First Migrations - 它如何记住以前的模型更改?

时间:2012-07-31 12:17:34

标签: entity-framework-4.3 ef-migrations

所以我正在使用实体框架代码优先迁移。

我对我的模型进行了更改,添加了一个新的手动迁移,它使得脚本错误。

所以我删除了迁移,同时我不会按照我的想法改变它。删除迁移类并重置模型(即将其设置为原样)后,我再次更改模型。

当我生成新迁移时,此迁移将充当“如果它正在从我删除的迁移更改。”

如果清理和删除迁移,实体框架代码如何首先知道最后的模型状态?

你怎么重置这个?

2 个答案:

答案 0 :(得分:2)

在您的数据库中,在“表/系统表”下(假设您使用SQL Management Studio),编辑Table __MigrationHistory

在我删除了所有迁移* .cs文件之后,我也发现了这一点,并且仍然“知道”旧的迁移!!

答案 1 :(得分:0)

您可能没有删除其下方的Designer文件,其中包含有关自动迁移的信息。

http://msdn.microsoft.com/en-US/data/jj554735

  

运行Add-Migration AddBlogRating命令...

     

迁移还有一个代码隐藏文件,用于捕获一些元数据。此元数据将允许代码优先迁移复制我们在此基于代码的迁移之前执行的自动迁移。如果另一个开发人员想要运行我们的迁移或者需要部署我们的应用程序,这一点很重要。

代码隐藏是一个类似201206292305502_AddBlogRating.Designer.cs的文件,位于您创建的手动迁移类之下。它看起来像:

public sealed partial class AddBlogRating : IMigrationMetadata
{
    string IMigrationMetadata.Id
    {
        get { return "201206292305502_AddBlogRating"; }
    }

    string IMigrationMetadata.Source
    {
        get { return "H4sIAAAAAAAEAOy9B2AcSZ...=="; }
    }

    string IMigrationMetadata.Target
    {
        get { return "H4sIAAAAAAAEAOy9B2AcSZ...=="; }
    }
}

这2个字符串是在迁移之前和之后的整个模型的base64编码转储。我们的想法是,在第一次手动迁移之前记录的任何内容都是自动的,因此当您将所有这些应用到新的数据库时,它可以看起来并说:

手动1
手册2

检查Source以确定在Manual1之前的目标模型,使用自动方法应用,应用Manual1,在Manual2上检查Source,使用自动方法到达那里,应用Manual2,最后使用自动方法从那里获取到当前编译的模型状态