所以我正在使用实体框架代码优先迁移。
我对我的模型进行了更改,添加了一个新的手动迁移,但它使 up 脚本出错。
所以我删除了迁移,同时我不会像我想的那样改变它。在删除迁移类并重置模型(即,将其设置回原样)后,我再次更改我的模型。
当我生成一个新的迁移时,这个迁移就像我删除的迁移一样。
如果您清理和删除迁移,实体框架代码如何首先知道最后一个模型状态?
你如何重置它?
所以我正在使用实体框架代码优先迁移。
我对我的模型进行了更改,添加了一个新的手动迁移,但它使 up 脚本出错。
所以我删除了迁移,同时我不会像我想的那样改变它。在删除迁移类并重置模型(即,将其设置回原样)后,我再次更改我的模型。
当我生成一个新的迁移时,这个迁移就像我删除的迁移一样。
如果您清理和删除迁移,实体框架代码如何首先知道最后一个模型状态?
你如何重置它?
在您的数据库中,在“表/系统表”下(假设您使用 SQL Management Studio),编辑Table __MigrationHistory
.
在我删除了所有迁移 *.cs 文件并且仍然 VS“知道”旧迁移之后,我也感到困惑!
直到那时,您可能还没有删除它下面的 Designer 文件,该文件包含有关自动迁移的信息。
http://msdn.microsoft.com/en-US/data/jj554735
运行 Add-Migration AddBlogRating 命令...
迁移还有一个代码隐藏文件,用于捕获一些元数据。此元数据将允许 Code First 迁移复制我们在此基于代码的迁移之前执行的自动迁移。如果另一个开发人员想要运行我们的迁移或需要部署我们的应用程序,这很重要。
代码隐藏是一个类似 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
在Manual1之前检查Source以确定目标模型,使用Automatic方法应用,应用Manual1,在Manual2上检查Source,使用自动方法到达那里,应用Manual2,最后使用自动方法从那里到达当前编译的模型状态。