21

我首先使用实体​​框架代码开始了我的项目。当我准备好时,我将我的数据库和代码上传到我的主机提供商。一切正常。

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

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

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

我究竟做错了什么?

4

2 回答 2

27

根据我的经验,这表明迁移表不同步(即使您的数据不同步),并且现在已成为 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]记录,
    运行这些记录,将它们插入数据库,
    并确保你的数据库- 和代码匹配,

这应该使事情再次同步运行。

(免责声明:这不是始终有效的防弹措施,您可能需要根据当地情况尝试一些事情 - 但应该让您保持同步)

于 2012-04-21T00:16:49.413 回答
1

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

此外,此链接对于使用脚手架更新 EF 中的数据库非常有帮助 http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-entity-framework-scaffolding-and -迁移

于 2016-02-01T17:34:17.833 回答