EF6 - BUG? - 迁移检查项目的数据库,但写入构建的数据库

时间:2014-06-11 09:33:18

标签: entity-framework entity-framework-6 entity-framework-6.1

与此同时,我至少找到了问题的原因。如果您不想阅读我已完成的所有步骤,只需向下滚动到此帖末尾的Edit1。

我目前正面临EF 6的问题,我不知道这是一个错误,是设计还是我不够了解EF :(

我在一个解决方案中有 3个项目:服务器项目,客户项目和模型项目。
该模型包含我的服务器和客户端上下文类使用的实体,每个实体都在我的服务器和客户端项目的命名空间内。

我的上下文类(在模型名称空间内)包含 2个DBSet 对象: [Srv | Cli]实体 CoreEntity 。两者都是抽象类我的真实"实体继承自,因此我不必在我的上下文类中定义每个实体 结果是从每个基类继承的每个实体的新表和每个基类本身的表,称为 CoreEntityRegistry [Srv | Cli] EntityRegistry

我做的第一件事是启用迁移,添加初始迁移和更新数据库而没有任何问题。

我已经完成了 客户端 代码和数据建模,之后启用了迁移并添加了初始迁移。此时我不记得是否进行了数据库更新,但我想是这样,因为如果不是,我会收到一些例外,试图访问调试期间无法使用的数据库元素。

回到模型项目我为服务器编辑了一些实体,我认为也是服务器和客户端(= Core)。

我再次为 服务器 项目运行Add-Migration,但这次EF抱怨有待迁移。实际上这是不可能的,但我想我只是再次运行Update-Database来确定 此命令已成功运行 但是,一旦我再次尝试Add-Migration:来自EF的相同待处理错误。

查看数据库表 __ MigrationHistory ,我可以看到我的迁移,但 ContextKey 设置为 LRCM.Client.Migrations.Configuration ,而不是 LRCM.Server.Migrations.Configuration ,这很可能是为什么我仍然有鬼待决状态。
这是我的第一个谜:这怎么可能?启用迁移时,我为正确的 ProjectName ProjectStartUpName ContextTypeName 指定了参数。甚至尝试指定配置 ConfigurationTypeName 参数而不做任何更改。

长话短说,我真的尝试了一切我想象的解决方法:重命名配置类名,更改名称空间(每个上下文一个),将MigrationNamespace设置为迁移配置,设置 ContextKey 手动配置等。

最后我想(项目仍然处于初始状态)我只是删除服务器和客户端的数据库,从服务器和项目中删除所有迁移文件和文件夹,将我的上下文类放在每个相应的项目(客户端,服务器),目前只为我的服务器启用迁移,以确保在我为客户端项目启用迁移之前这个工作正常。

正在运行Add-Migration看起来很有希望,但正在运行Update-Database教会我其他方面 现在我收到了(我在上面的测试中也收到了它)关于已经存在的表的错误。相关表是我的CoreEntities(也由客户端上下文使用),但我的迁移文件不包含此类 CREATE 语句两次。 我想以某种方式迁移尝试合并我的客户端和我的服务器上下文 - 但为什么? 除了他们共享某些实体之外,他们之间没有任何联系。

再看一下DB网站,我可以看到我的所有表格都在__MigrationHistory表中创建 - 惊喜:仍然是相同的ContextKey 值。

这是我的第二个谜: 为什么ContextKey仍然是解决方案中第一个使用的?它被缓存在某个地方吗? 为什么迁移尝试添加我的表两次,尽管迁移文件只有一个 CREATE 语句?

对于某些代码示例(此处的代码功能不适合长代码输入)请参阅我昨天打开的另一个主题,但我怀疑我在那里没有收到任何答案:MSDN Forum < / p>

我真的很感激我可以帮助解决这个问题。

的问候,
汤姆

编辑1:
与此同时,我至少没有什么成功 我从服务器和客户端项目中删除了与迁移相关的所有内容 在我的服务器环境中评论了我的DBSet for CoreEntity 已启用服务器项目迁移 成功添加了迁移文件 成功更新了数据库。
重置所有迁移内容,这次使用了CoreEntity的上下文 添加迁移和更新数据库再次成功 为客户项目启用迁移。
已成功添加迁移和更新数据库。

在我为客户端项目启用迁移之前,我已经对数据库进行了另一次查看,这次我在 __ MigrationHistory 中看到了两个条目。一个是旧的(错误的)ContextKey,另一个是正确的 因此,我再次删除了所有数据库并执行了Update-Database。而这次只有一个正确的进入。

但现在我又有待处理的问题了。无论我多久运行Update-Database

这引出了我必须检查的其他结论:
如果我从项目文件夹中删除数据库文件,则迁移会警告缺少数据库。但是,如果我再次将此文件添加为新数据库,则可以正常工作 我看到的问题(我认为我这样做)是迁移在我的构建的 AppData 文件夹下更新我的数据库,它在调试期间使用它,但检查(无论出于何种原因)对于我项目的 AppData 文件夹中的数据库,其中只有一个没有任何表的数据库文件。

我是对的,至少找到了原因
当我执行Update-Database时,它连接到构建文件夹结构内的数据库,但不是项目文件夹结构中的数据库。

所以我的最后一个问题(我也将在标题中更改)是: 为什么基于EF代码的迁移检查项目数据库文件中的迁移,而只是写入build的DB文件中的DB文件?看起来几乎像一个bug?!

1 个答案:

答案 0 :(得分:0)

最后 - 它似乎真的是一个错误。我甚至可以在新项目中重现这种错误行为,并猜测在我的环境中,基于EF 6代码的迁移无法正常工作。

因此,我最终编写了一份错误报告,您可以关注here

如果其他人应该能够重现该行为,请参与错误报告以解决此问题或更快地找到解决方法。