EF6 数据库优先 - EF 尝试创建我的数据库(但所有表已经存在)

3
好的,背景是这样的。我正在重建一个旧的MVC3网站。我有一个最近的Database First MVC5 EF6项目,使用了相同的UI包。我复制了现有的项目,并将几乎所有内容都删除了(所有特定于项目的POCO模型、DbContext、视图等),基本上只留下了新的Identity内容和我的UI框架。
我创建了脚本来手动将我的数据库从SQLMembership转换为Identity 2.0(以及一些密码转换的代码)。一切都很顺利,它编译通过了,我可以作为现有用户登录。
接下来,我创建了一个新的临时项目(我不想弄乱实际项目命名空间),为所有现有表生成了新数据库的POCO模型,将它们复制到我的项目中,并手动编写了DataModel Fluent API代码。在模型生成时,我遇到了一些验证错误,但我没有问题地解决了。但现在,当尝试执行任何访问DataModel的操作时,会出现异常错误,因为__MigrationHistory已经存在。
进一步调查EF SQL调试输出显示,它正在尝试运行脚本来创建我的数据库中的所有表,当它尝试创建__MigrationHistory表时,由于它已经存在(尽管我应该注意到它没有记录),它最终会抛出错误。
那么我做了什么不同的事情?EF如何知道不要在我的其他项目中尝试这样做,而在DataModel结构和POCO Model结构方面与我的新项目相同且正常工作?我应该怎么做才能修复它?我知道我可以制作自己的初始化程序(如何禁用Entity Framework 4.3 Code First中的__MigrationHistory表的使用?),但我更愿意理解发生了什么并在源头上进行修复,而不是绕过它编写代码。
1个回答

5

在您的项目中删除现有的Migrations文件夹。从现有数据库中DROP掉表“__MigrationHistory”。现在,您可以重建此历史记录表:

PM> enable-migrations
PM> add-migration Initial -IgnoreChanges
PM> update-database

-IgnoreChanges 选项会创建空的 Up() 方法,并且不对现有对象进行任何更改。


谢谢VahidN,这确实起作用了。一些注意事项; 我没有原始的迁移文件夹。在运行这些命令试图弄清楚发生了什么之后,我删除了新创建的迁移文件夹,并且还删除了在新的__MigrationsHistory表中创建的记录。因此,据我所知,一切都回到了运行这些命令之前的状态,但现在一切都像正常预期的那样工作。那么还发生了什么?如果您能提供更多信息或链接以便我更好地理解,将不胜感激。再次感谢您的帮助。 - Josh
2
MigrationHistory表保存了您的领域模型和数据库中现有表的哈希值。如果您更改其中一个模型,EF能够重新计算此哈希值并将其与MigrationHistory表中的旧值进行比较,然后再次更新您的数据库。但是,如果您手动更改数据库,则会发现数据库中已更改了某些内容,因为哈希值不同,但这次它不知道如何解决此冲突。因此,在代码优先方法中,不要尝试像数据库优先方法一样行事/设计。 - VahidN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接