EF中的空迁移和快照冲突

时间:2016-06-05 22:00:55

标签: c# asp.net-mvc entity-framework

假设我有一个使用此实体框架模型的应用程序:

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方法中对所有内容进行评论(添加新列只有1行,Bio)并执行Update-Database。现在,当我尝试将新作者添加到我的数据库时,我从运行时收到“发生错误,请参阅详细内部异常”消息。

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

如果我遇到这种情况,有没有办法解决问题(我认为这是一个非常容易混淆那些正在研究.NET项目的人的方法)?回滚到上一次迁移,然后取消注释最新迁移的代码并再次运行它?添加一个包含已注释掉内容的(新)迁移?感谢。

2 个答案:

答案 0 :(得分:0)

如果我理解正确的话 - 你就不能真的做那些特别的事情,因为这样做不会很好。除非它完全是关于实验 - 或者你真的了解所涉及的所有复杂问题。

基本上你有&#3; 3部分&#39;参与等式:

  • 您的代码,POCO课程
  • 基于您的模型生成的Db结构,表格等
  • 以及包含&#39;元数据的__MigrationHistory表格。并同步两种

你所做的是评论在Db中生成必要字段的部分 - 但你的模型/类仍然是相同的(所以你应该在那里评论一些东西,而不是我推荐的正在做)。

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

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

以下是一些链接(我的答案),描述了get into trouble的更多方法,如果/何时发生,请让自己离开它:
how to manually sync with the Db
How to delete and recreate from scratch an existing EF Code first database

答案 1 :(得分:0)

如果您要回滚最新的迁移,可以尝试完成这些步骤

1)首先在“程序包管理器控制台”中执行RewriteEngine on RewriteCond %{THE_REQUEST} \s/+(.+)\.php[\s?] [NC] RewriteRule ^ /%1 [R=301,L,NE] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php 命令,您将收到已应用于数据库的迁移。 例如: Get-Migrations

2)执行201605181535083_ThisOneWhichYouWantRollback 201605181535083_LastSuccessful 201605181535083_Initial命令。此命令将回退并撤消当前和“LastSuccessful”迁移之间的任何迁移。

3)之后,您可以尝试再次注释迁移代码和update-database -TargetMigration "LastSuccessful"

参考文献: reverse relation