Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在实体框架中,如何使用主键的子集创建引用约束?_Entity Framework - Fatal编程技术网

Entity framework 在实体框架中,如何使用主键的子集创建引用约束?

Entity framework 在实体框架中,如何使用主键的子集创建引用约束?,entity-framework,Entity Framework,我的数据模型包含两个具有复合主键的表和一个关联表。组合主键的一部分在表之间是通用的 SitePrivilege ------------- SiteId PrivilegeId UserSite -------- SiteId UserId UserSitePrivilege ----------------- UserId SiteId PrivilegeId 我已经创建了SitePrivilege实体和UserSite实体。我已将它们之间的多对多关联映射到UserSitePrivile

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

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已映射到 UserSitePrivilegeSitePrivilege.SiteId, UserSitePrivilege.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>

...
现在它会产生以下错误:

委托人转介的财产 角色UserSite必须完全相同 与EntityType的键相同 引用的PrivilegeModel.UserSite 关系中的主要角色 关系约束 PrivilegeModel.UserSitePrivilege。 确保所有键属性都是 在主体角色中指定


如何正确地建立这种关系的模型?

如果主键是复合键,那么所有外键关系也必须使用整个复合键(所有键列)作为参考-我看不到任何方法可以绕过这一点,这是关系数据库设计的基本原则,真的

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

更新:是的,根据您的评论,您完全正确-DB设计非常可靠。不太清楚为什么英孚不能处理这个


Marc

3.5 SP1不支持这样的重叠FK

i、 e

FK1与FK2重叠。这将从EF 4的Beta2开始得到支持。这是因为FK关联(在Beta2中提供)比独立关联(在3.5SP1和4.0Beta1中提供)灵活得多

有关更多信息,请参阅此帖子

同时,您唯一的选择可能是将所有这些隐藏在定义查询和CUD过程等后面

  • 亚历克斯

外键中使用的是整个复合键。UserSitePrivilege有两个复合外键:(UserId,SiteId)和(SiteId,PrivilegeId)。但是,由于它是一个关联表,所以不能表示为实体。任何一个表上的代理主键都可以解决这个问题,但我希望我不必为了满足EF而要求DBA更改DB设计。他的设计是正确的。
UserSitePrivilege
----------
UserId 
SiteId
PrivilegeId

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