在Entity Framework中,如何使用主键的子集创建引用约束?

entity-framework

我的数据模型包含两个包含复合主键和关联表的表。复合主键的一部分在表之间是通用的。

SitePrivilege
-------------
SiteId
PrivilegeId

UserSite
--------
SiteId
UserId

UserSitePrivilege
-----------------
UserId
SiteId
PrivilegeId

我创建了一个SitePrivilege实体和一个UserSite实体。我已将它们之间的多对多关联映射到UserSitePrivilege。

<Association Name="UserSiteSitePrivilege">
  <End Type="PrivilegeModel.UserSite" Multiplicity="*" Role="UserSite" />
  <End Type="PrivilegeModel.SitePrivilege" Multiplicity="*" Role="SitePrivilege" />
</Association>
...
<AssociationSetMapping Name="UserSiteSitePrivilege" TypeName="PrivilegeModel.UserSiteSitePrivilege" StoreEntitySet="UserSitePrivilege">
  <EndProperty Name="SitePrivilege">
    <ScalarProperty Name="PrivilegeId" ColumnName="PrivilegeId" />
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
  </EndProperty>
  <EndProperty Name="UserSite">
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
    <ScalarProperty Name="UserId" ColumnName="UserId" />
  </EndProperty>
</AssociationSetMapping>

上面的代码产生了这个错误:

表UserSitePrivilege中的以下每列都映射到多个概念侧属性:UserSitePrivilege.SiteId映射到UserSiteSitePrivilegeSitePrivilege.SiteId,UserSiteSitePrivilege.UserSite.SiteId

所以我添加了一个引用约束。

<Association Name="UserSiteSitePrivilege">
  <End Type="PrivilegeModel.UserSite" Multiplicity="*" Role="UserSite" />
  <End Type="PrivilegeModel.SitePrivilege" Multiplicity="*" Role="SitePrivilege" />
  <ReferentialConstraint>
    <Principal Role="UserSite">
      <PropertyRef Name="SiteId"/>
    </Principal>
    <Dependent Role="SitePrivilege">
      <PropertyRef Name="SiteId"/>
    </Dependent>
  </ReferentialConstraint>
</Association>
...
<AssociationSetMapping Name="UserSiteSitePrivilege" TypeName="PrivilegeModel.UserSiteSitePrivilege" StoreEntitySet="UserSitePrivilege">
  <EndProperty Name="SitePrivilege">
    <ScalarProperty Name="PrivilegeId" ColumnName="PrivilegeId" />
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
  </EndProperty>
  <EndProperty Name="UserSite">
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
    <ScalarProperty Name="UserId" ColumnName="UserId" />
  </EndProperty>
</AssociationSetMapping>

现在它产生了这个错误:

Principal Role UserSite引用的属性必须与Relationship PrivilegeModel.UserSiteSitePrivilege的关系约束中的Principal Role引用的EntityType PrivilegeModel.UserSite的键完全相同。确保在主体角色中指定了所有关键属性。

我如何正确建模这种关系?

一般承认的答案

3.5 SP1中不支持这样的重叠FK。

UserSitePrivilege
----------
UserId 
SiteId
PrivilegeId

PK => UserId, SitedId, PrivilegeId
FK1 => UserId, SiteId
FK2 => SiteId, PrivilegeId

FK1与FK2重叠。从EF 4的Beta2开始,这将得到支持。这是因为FK关联(在Beta2中可用)比独立关联(您在3.5 SP1和4.0 Beta 1中拥有的)更灵活。

有关FK协会的更多信息,请参阅此帖子

与此同时,您唯一的选择可能是隐藏DefiningQueries和CUD程序等所有这些。

  • 亚历克斯

热门答案

如果你的主键是复合键,你所有的外键关系也必须使用整个复合键(所有键列)作为参考 - 我没有看到任何解决方法,这是关系数据库的基本原则设计,真的。

这绝对是我可能选择在主表上使用替换列作为主键的主要原因之一,而不是由实际数据列组成的复合键。

更新:是的,根据你的评论,你是绝对正确的 - 数据库设计是可靠的。不太清楚为什么EF不能处理这个....



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因