MVC3和Code First Migrations - "创建数据库后,支持'blah'上下文的模型已经改变"

Sco*_*ich 20 entity-framework asp.net-mvc-3 ef-migrations

我使用Entity Framework Code First开始了我的项目.当我准备好时,我将我的数据库和代码上传到我的主机提供商.一切正常.

我需要在我的一个类中添加一个新字段,我不想丢失数据库中的数据.因此,我尝试了一些关于使用Code First Migrations的博客文章.我做了以下事情:

  1. 我备份了我的远程(生产)数据库.
  2. 我在本地附加了这个数据库
  3. 我把这个属性添加到了我的班级
  4. PM>启用 - 迁移
  5. PM> Add-Migration AddSortOrderToCar
  6. PM>更新 - 数据库
  7. 此时,我创建了本地数据库的.bak文件,然后使用该文件"恢复"到远程文件.
  8. 最后,我将代码发布到远程站点.

当我访问该网站时,我收到以下错误消息:自创建数据库以来,支持'blahblah'上下文的模型已更改.考虑使用Code First Migrations来更新数据库.

我究竟做错了什么?

NSG*_*aga 25

根据我的经验,这表明迁移表不同步(即使你的数据不是),而且现在已经成为db模式的一部分(从4.3开始我认为 - 在系统表下).

可能有很多原因和方法来体验这种错误,但大部分时间......

有问题的部分是手动支持/恢复整个数据库与代码更改的一些组合 - 我不完全确定为什么总是如此.

简而言之,即使Db-s是相同的迁移表,数据也可能不是 - 并且哈希比较可能会失败(仍然完全恢复听起来不够好 - 但你有'双方').


对我有用的是使用
Update-Database -Script

这会创建一个具有"迁移差异"的脚本,
您可以将其作为SQL脚本手动应用于目标服务器数据库(并且应该插入正确的迁移表行等).

如果仍然不起作用 - 你仍然可以做两件事......

  1. 删除迁移表(目标 - 在系统表下) - 根据http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx评论在那里 - 这应该回到以前的行为,如果你确定你的Db-s是相同的 - 它只是'信任你',

  2. 作为最后的手段我使用 - 制作一个Update-Database -Script完整的模式(例如,通过初始化一个空的数据库,它应该强制执行'完整的脚本'),
    查找INSERT INTO [__MigrationHistory]记录,
    只需运行它们,将它们插入数据库,
    并确保您的数据库 - 和代码匹配,

应该让事情再次同步.

(免责声明:这不是一个可以随时工作的防弹,你可能需要根据当地情况尝试一些事情 - 但应该让你同步)