Entity framework EF6-错误?-迁移检查项目';s DB,但写入构建';分贝

Entity framework EF6-错误?-迁移检查项目';s DB,但写入构建';分贝,entity-framework,entity-framework-6,entity-framework-6.1,Entity Framework,Entity Framework 6,Entity Framework 6.1,与此同时,我至少找到了问题的原因。如果您不想通读我完成的所有步骤,只需在本文末尾向下滚动到Edit1即可。 我目前面临EF 6的一个问题,我不知道这是一个bug,是设计还是我对EF理解不够:( 我在一个解决方案中有三个项目:服务器项目、客户端项目和模型项目。 该模型包含服务器和客户端的上下文类使用的实体,每个实体都位于服务器和客户端项目的命名空间内 我的上下文类(都在模型名称空间内)包含2个DBSet对象:[Srv|Cli]Entity和CoreEntity。它们都是我的“真实”实体继承自的抽象

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

我目前面临EF 6的一个问题,我不知道这是一个bug,是设计还是我对EF理解不够:(

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

我的上下文类(都在模型名称空间内)包含2个DBSet对象:[Srv|Cli]EntityCoreEntity。它们都是我的“真实”实体继承自的抽象类,因此我不必在上下文类内定义每个实体。
结果是为从每个基类继承的每个实体创建一个新表,并为每个基类本身创建一个名为CoreEntityRegistry[Srv | Cli]EntityRegistry的表

我做的第一件事是启用迁移,添加初始迁移,并在没有任何问题的情况下更新数据库

之后,我在客户机上工作了代码和数据建模,随后启用了迁移并添加了初始迁移。此时,我再也记不起是否进行了数据库更新,但我想是这样的,因为如果不进行更新,我会收到一些异常,试图访问在迁移期间不可用的数据库元素调试

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

然后,我再次为服务器项目运行了
添加迁移
,但这一次EF抱怨了一个挂起的迁移。实际上这是不可能的,但我想我只是再次运行
更新数据库
来确定。
此命令已成功运行。
但当我再次尝试
添加迁移时
:来自EF的相同挂起错误

查看数据库表\uu MigrationHistory,我可以看到我的迁移,但是ContextKey被设置为LRCM.Client.Migrations.Configuration,而不是LRCM.Server.Migrations.Configuration,这很可能就是我仍然处于重影挂起状态的原因。
这是我的第一个谜团:这怎么可能?启用迁移时,我为正确的ProjectName、ProjectStartUpName和ContextTypeName指定了参数。甚至尝试在没有任何更改的情况下指定Configuration或ConfigurationTypeName参数

长话短说,我真的尝试了我能想象到的一切来解决这个问题:重命名配置类名,更改名称空间(每个上下文一个),将MigrationNamespace设置为migration配置,将ContextKey手动设置为configuration等等

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

运行
addmigration
看起来很有希望,但运行
updatedatabase
教会了我一些其他的东西。
现在我收到一个关于已经存在的表的错误(我在上面的测试中也收到了这个错误)。相关的表是我的CoreEntities(也被客户端上下文使用)的表,但是我的迁移文件没有两次包含这样的CREATE语句。 我想迁移会尝试合并我的客户端和服务器上下文-但是为什么呢? 它们之间没有任何联系,只是它们共享一些实体

再次查看DB站点,我可以看到我创建的所有表以及uu MigrationHistory表中的所有表-令人惊讶的是:仍然是相同的ContextKey

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

对于一些代码示例(此处的代码功能不适合长代码输入),请参阅我昨天打开的另一个线程,但我怀疑我不会在那里收到任何答案:

我真的很感激能帮我解决这个问题

问候,
汤姆

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

在为客户端项目启用迁移之前,我在DB中进行了另一次查看,这次我在迁移历史中看到了两个条目。一个是旧的(错误的)ContextKey,另一个是正确的。
因此,我再次删除了所有数据库,并执行了
updatedatabase
。这次只有一个正确的条目

但现在我又遇到了悬而未决的问题。无论我多久运行一次
updatedatabase

这让我得出了另一个我必须核实的结论:
如果我从项目文件夹中删除数据库文件,迁移会发出丢失数据库的警告。但是,如果我再次将此文件添加为新数据库,它将正常工作。
我看到的问题(我想我看到了)是迁移会在我的构建下更新我的数据库