2

我想在现有的SQL Server基础结构上设置一个EDM,并遇到了一个问题。实体框架不能解决与复合主键的PK-FK关系?

EDM将而不是解决复合外键的PK-FK关系。

我的数据库表结构看起来是这样的(名称更改为保护无辜者):

  • 我有一个包含名为PerID(PK)
  • 我有一个包含一个OFFICE表中的INT列一个人的表一个名为OffID(PK)的INT列
  • 我使用名为OFFICEPONSONS的表将这些表绑在一起,从而在人员和办公室之间创建多对多关系。该表有两个INT列,PerID和OffID,它们一起构成一个复合主键。
  • 我有一个名为OFFICELOCATION的表,它包含两个INT列,LocID和OffID。这两列包含一个复合主键。此外,OffID也是OFFICE表的FK。
  • 最后,我有一个名为OFFICEPERSONSLOCATION的表。该表有三个INT列:PerID,OffID和LocID。所有三列包含一个复合主键。 LocID和OffID提供与OFFICELOCATION的FK关系,并且OffID和PerID向OFFICERSONS提供FK关系。

到目前为止我和谁?希望我还没有失去你。当所有事情都说完之后,我的结构看起来像这样: Database structure diagram

这个结构在SQL Server中很好。在电火花?没那么多。它不会允许我构建OFFICEPERSONSLOCATION和OFFICERSERSONS之间的关系。我得到以下错误:

Error 6037: Foreign key constraint 'FK_OFFICEPERSONSLOCATION_OFFICEPERSONS' has been omitted from the storage model. Column 'OffID' of table 'Model.Store.OFFICEPERSONSLOCATION' is a foreign key participating in multiple relationships. A one-to-one Entity Model will not validate since data inconsistency is possible.

咦?数据不一致?!?怎么样?

如何让我的实体框架认识到这一点?

+0

我意识到实体框架通常不代表交叉参考表,而是在没有交叉参考表的情况下使用多对多关系链接两个表。这是否与我试图将交叉引用表与另一个交叉引用表链接起来? – 2013-02-27 20:53:37

+0

我被告知我的EF版本可能与它有关。不知道我正在运行什么版本,但我认为它早于EF4。我正在运行VS2010。 – 2013-02-27 21:37:50

回答

1

我同意这是实体框架的问题,而且问题很蠢。即使您将UPDATE CASCADE设置为“无操作”,也不会像您可以创建不一致,但不会,它声称您可以以某种方式进行操作。

在任何情况下,在这种情况下,如果你愿意用代理键而不是复合键,就可以解决这个问题,因为要改变ID号的唯一地方是在主表。

在这种情况下,OffID可能是“不一致”,但通过使用OFFICEPERSONS和OFFICELOCATIONS表中的ID(因此在OFFICEPERSONSLOCATION中引用),您不得不在其主表中管理OffId。

+0

感谢您的回答;不幸的是,在我发布这个问题几天后,我当时正在为公司工作的公司解雇了我。所以除非我再次遇到这种情况,否则我想我永远不会知道这是否是答案。 – 2014-02-18 17:03:25

+1

对不起。但是,您可以在最近的实体框架中避免此问题,但如果您考虑此问题,则在其中一个中间表中更改办公室ID会导致不一致。 OfficePersonsLocation Office ID会更改为Office Persons还是Office Location? DB不知道。使用代理键时,OffID只存储在主表中,因此ID始终保持一致。 – Mark 2014-02-18 20:25:45

+0

诚然,虽然在该环境中,Office ID永远不会改变。 – 2014-02-19 13:52:05