好的,背景是这样的。我正在重建一个旧的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表的使用?),但我更愿意理解发生了什么并在源头上进行修复,而不是绕过它编写代码。
我创建了脚本来手动将我的数据库从SQLMembership转换为Identity 2.0(以及一些密码转换的代码)。一切都很顺利,它编译通过了,我可以作为现有用户登录。
接下来,我创建了一个新的临时项目(我不想弄乱实际项目命名空间),为所有现有表生成了新数据库的POCO模型,将它们复制到我的项目中,并手动编写了DataModel Fluent API代码。在模型生成时,我遇到了一些验证错误,但我没有问题地解决了。但现在,当尝试执行任何访问DataModel的操作时,会出现异常错误,因为__MigrationHistory已经存在。
进一步调查EF SQL调试输出显示,它正在尝试运行脚本来创建我的数据库中的所有表,当它尝试创建__MigrationHistory表时,由于它已经存在(尽管我应该注意到它没有记录),它最终会抛出错误。
那么我做了什么不同的事情?EF如何知道不要在我的其他项目中尝试这样做,而在DataModel结构和POCO Model结构方面与我的新项目相同且正常工作?我应该怎么做才能修复它?我知道我可以制作自己的初始化程序(如何禁用Entity Framework 4.3 Code First中的__MigrationHistory表的使用?),但我更愿意理解发生了什么并在源头上进行修复,而不是绕过它编写代码。
MigrationHistory
表保存了您的领域模型和数据库中现有表的哈希值。如果您更改其中一个模型,EF能够重新计算此哈希值并将其与MigrationHistory
表中的旧值进行比较,然后再次更新您的数据库。但是,如果您手动更改数据库,则会发现数据库中已更改了某些内容,因为哈希值不同,但这次它不知道如何解决此冲突。因此,在代码优先方法中,不要尝试像数据库优先方法一样行事/设计。 - VahidN