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

时间:2012-04-20 23:00:49

标签: entity-framework asp.net-mvc-3 ef-migrations

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

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

  1. 我备份了我的远程(生产)数据库。
  2. 我在本地附加了这个数据库
  3. 我将该属性添加到我的班级
  4. PM>启用的迁移
  5. PM>添加迁移AddSortOrderToCar
  6. PM>更新数据库
  7. 此时我创建了本地数据库的.bak文件,然后使用该文件“恢复”到远程文件。
  8. 最后,我将代码发布到远程站点。
  9. 当我访问该网站时,我收到以下错误消息: 自数据库创建以来,支持'blahblah'上下文的模型已经发生了变化。请考虑使用Code First Migrations来更新数据库。

    我做错了什么?

2 个答案:

答案 0 :(得分: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]条记录,
    只需运行它们,将它们插入数据库,
    并确保您的数据库 - 和代码匹配,

  3. 应该让事情再次同步。

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

答案 1 :(得分:0)

我认为在第6步中你需要运行Update-Database -Verbose

此链接对于使用Scaffolding更新EF中的数据库非常有用 http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-entity-framework-scaffolding-and-migrations