在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不能處理這個....



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因