EF中的空迁移和快照冲突



假设我有一个具有以下实体框架模型的应用程序:

public class Author
{
public int ID { get; set; }
public string Name{ get; set; }
}
public class Context : DbContext
{
public DbSet<Author> Authors{ get; set; }
}

因此,我做了一些常见的事情,运行应用程序,创建初始数据库模式,然后启用迁移并更新数据库。

现在,假设我将另一个属性添加到Authorstring Bio。我键入Add-Migration AddBio并生成适当的文件。

这就是令人困惑的地方:我尝试在新创建的迁移的Up方法中注释所有内容(这只是添加新列Bio的一行),然后执行Update-Database。现在,当我尝试向数据库中添加新作者时,我会从运行时收到"error occured,see internal exception for details"的消息。

我意识到这是上一个模型快照和数据库模式之间不一致的结果(如果我错了,请纠正我)。当我执行Add-Migration ...时,会创建一个新的模型快照,并且它假设Description是数据库模式的一部分。。。只是事实并非如此。

如果我遇到这种情况,有没有办法解决问题(我认为这是一种非常容易故意混淆正在从事.NET项目的人的方法)?回滚到上一次迁移,然后取消对最近一次迁移的代码的注释,然后再次运行它?是否添加将包含注释掉的内容的(新)迁移?谢谢

如果我理解正确的话,你真的不能做那种"临时"的事情,因为这不会有好的结局。除非这一切都是为了实验——或者你真的了解其中的所有错综复杂之处。

基本上,方程中包含"3个部分":

  • 您的代码,POCO类
  • 基于您的模型生成的Db结构、表等
  • 以及__MigrationHistory表,该表保存"元数据"并同步两种类型的

您所做的是对Db-中生成必要字段的部分进行注释,但您的模型/类仍然是相同的(所以您也应该在其中进行注释,而不是我建议您这样做)。

Bottom line, things need to be and stay in sync.

最好的方法是避免在Db或生成的代码中进行任何手动更改,并遵循最佳实践规则,即遵循建议。

以下是一些链接(我的答案),描述了get into trouble的一些更多方法,并在发生时摆脱它:
如何手动与Db同步
如何从头开始删除和重新创建现有的EF代码优先数据库

如果您想回滚最新的迁移,可以尝试完成以下步骤

1) 首先在"Package Manager控制台"中执行Get-Migrations命令,您将收到已应用于数据库的迁移。例如:201605181535083_ThisOneWhichYouWantRollback 201605181535083_LastSuccessful 201605181535083_Initial

2) 执行update-database -TargetMigration "LastSuccessful"命令。此命令将倒带并撤消当前迁移和"LastSuccessful"迁移之间的任何迁移。

3) 之后,您可以再次尝试取消对迁移代码和Update-Database的注释。

参考文献:如何回滚实体框架代码第一次迁移

最新更新