假设我有一个使用此实体框架模型的应用程序:
public class Author
{
public int ID { get; set; }
public string Name{ get; set; }
}
public class Context : DbContext
{
public DbSet<Author> Authors{ get; set; }
}
所以我会运行应用程序的常用内容,并创建初始数据库模式,然后启用迁移并更新数据库。
现在,我要向Author
,string Bio
添加另一个属性。我输入Add-Migration AddBio
并生成相应的文件。
以下是事情变得混乱的地方:我已尝试在新创建的迁移的Up
方法中对所有内容进行评论(添加新列只有1行,Bio)并执行Update-Database
。现在,当我尝试将新作者添加到我的数据库时,我从运行时收到“发生错误,请参阅详细内部异常”消息。
我意识到这是最后一个模型快照和数据库模式之间不一致的结果(如果我错了,请纠正我)。我创建Add-Migration ...
时创建了一个新的模型快照,并假设Description
是数据库模式的一部分...它只是它不是。
如果我遇到这种情况,有没有办法解决问题(我认为这是一个非常容易混淆那些正在研究.NET项目的人的方法)?回滚到上一次迁移,然后取消注释最新迁移的代码并再次运行它?添加一个包含已注释掉内容的(新)迁移?感谢。
答案 0 :(得分:0)
如果我理解正确的话 - 你就不能真的做那些特别的事情,因为这样做不会很好。除非它完全是关于实验 - 或者你真的了解所涉及的所有复杂问题。
基本上你有&#3; 3部分&#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