我的数据模型包含两个包含复合主键和关联表的表。复合主键的一部分在表之间是通用的。
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>
现在它产生了这个错误:
委托人转介的房产 角色UserSite必须完全正确 与EntityType的键相同 PrivilegeModel.UserSite引用 关系中的主要角色 关系的约束 PrivilegeModel.UserSiteSitePrivilege。 确保所有关键属性都是 在主要角色中指定。
如何正确建模这种关系?
答案 0 :(得分:4)
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中提供的内容)更灵活。
的更多信息,请参阅此帖子与此同时,您唯一的选择可能是隐藏DefiningQueries和CUD程序等所有这些。
答案 1 :(得分:1)
如果您的主键是复合键,所有外键关系也必须使用整个复合键(所有键列)作为参考 - 我没有看到任何解决方法,这是一个基本原则关系数据库设计,真的。
这绝对是我可能选择在主表上使用替换列作为主键的主要原因之一,而不是由实际数据列组成的复合键。
更新:是的,根据你的评论,你是绝对正确的 - 数据库设计是可靠的。不太清楚为什么EF无法解决这个问题....
马克