ADO EF - 错误的TPH派生类型之间的关联映射 [英] ADO EF - Errors Mapping Associations between Derived Types in TPH

查看:223
本文介绍了ADO EF - 错误的TPH派生类型之间的关联映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

背景



我写使用ADO实体框架使用Visual Studio .NET框架3.5 SP1 2008 SP1数据访问库。我想创建两个实体,它们都从抽象类型派生之间的关联。我代表使用表每个层级都实体继承层次(TPH ),这意味着只有两个表 - 每个实体继承层次。



注意您可以使用表每个类型(TPT),以避免这个问题,但它与它自己的缺点。请参见 href=\"http://stackoverflow.com/questions/190296/how-do-you-effectively-model-inheritance-in-a-database\">和的这里了解更多详情。继承持久性模型之间进行选择时



下面是实体模型的设计视图的截图:





和这里的数据库模式的屏幕截图





假设



当您使用Visual Studio 2008 SP1和.NET Framework 3.5 SP1,你很可能会收到以下内容的创建与TPH建模派生类型之间的ADO Entity Framework设计协会错误3034:两个实体用不同的密钥被映射到同一行。 。确保这两个映射片段做无图两组实体的重叠键同组行



根据我有什么的在线阅读,为了解决这个问题,你必须一个条件添加到关联上像这样的外键:

 <条件的ColumnName =端点1ISNULL = 假/> 

下面是此编辑为PersonPersonToPerson1协会的截图:





约束




  • 每个层级的基类(即节点和链路)的必须的是抽象的。

  • 从两个派生类型之间的关联的导航属性的必须的被链接类型区分(例如: PersonToPerson和PersonToLocation)。这意味着你的无法的创建链路和节点抽象基类之间的关联



问题:



当我创建实体模型如上所述和条件加入到如上述假设描述的AssociationMappings,我收到一个错误3023当我建立/验证模型

 错误1错误3023:问题在映射碎片开始线146,153,159,186,195,204,213 :列Link.Endpoint1没有默认值,不能为空。列值是需要存储实体数据。 
将实体与密钥(PK)不会往返时:
((PK不在'链路群的EntitySet还是PK并不能起到AssociationSetPersonPersonToPerson1角色PersonToPerson')和(PK在链路群的EntitySet还是PK扮演的角色PersonToPerson的AssociationSetPersonPersonToPerson1还是PK中AssociationSetPersonPersonToPerson'))
C扮演的角色'PersonToPerson':\Documents和Settings\Demo\My文件\Visual工作室2008\Projects\GraphExample2.BusinessEntities\GraphExample2.BusinessEntities\GraphModel.edmx 147 15 GraphExample2.BusinessEntities

这是实体框架是在上述情况下得到挂上的事情是,有到同一个外键映射两个属性。例如,对于端点1列和外键映射到PersonToLocation派生类型的个人财产,它映射到PersonToPerson派生型领袖属性。



我不明白为什么这是一个问题。由于领导者/跟随属性只在PersonToPerson派生类型 - 没有任何其他派生类型或基本类型 - 和同样是人/ Location属性也是如此,为什么不TypeDiscriminator场足以让EF找出哪些设置给定行中属于?



要我好像,如果你正在处理一个对象,其中TypeDiscriminator = 1,您将端点1中的领导者和端点2的追随者。同样,如果你正在处理一个对象,其中TypeDiscriminator = 2,您将端点1在人与端点2的位置



问:



你如何解决错误3023,以允许进行这些关联?





如何创建,我上面描述?



引用的ADO实体框架关联的类型





代码



SQL:

 使用[GraphExample2] 
GO
/ ******对象:表[DBO] [节点]脚本日期:2009年2月17日14时36分十三秒****** /
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
设置ANSI_PADDING ON
GO
CREATE TABLE [DBO]。[节点(
[节点ID] [INT] NOT NULL,
[NodeTypeDiscriminator] [INT] NOT NULL,
[名称] [VARCHAR(255)NOT NULL,
[说明] [VARCHAR(1023)NULL,
约束[PK_Node] PRIMARY KEY CLUSTERED

[节点ID] ASC
)和(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]
)ON [PRIMARY]
GO
设置ANSI_PADDING OFF
GO
/ ******对象:表[DBO] [链接]脚本日期:2009年2月17日14时36分12秒****** /
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [DBO]。[链接](
[链路ID] [INT] NOT NULL,
[LinkTypeDiscriminator] [INT] NOT NULL,
[端点1] [INT] NOT NULL,
[端点2] [INT] NOT NULL,
[名] [VARCHAR(255)NULL,
[说明] [VARCHAR(1023)NULL,
约束[PK_Link] PRIMARY KEY CLUSTERED

[链路ID] ASC
)和(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]
)ON [PRIMARY]
GO
设置ANSI_PADDING OFF
GO
/ ******对象:ForeignKey的[FK_Link_Node_Endpoint1]脚本日期:2009年2月17日14点36分12秒****** /
ALTER TABLE [DBO]。[链接] WITH CHECK ADD CONSTRAINT [FK_Link_Node_Endpoint1]外键([端点1])$ ​​b $ b参考文献[DBO]。[节点]([节点ID])
GO
改变TABLE [DBO] [链接] CHECK约束[FK_Link_Node_Endpoint1]
GO
/ ******对象:ForeignKey的[FK_Link_Node_Endpoint2]脚本日期:2009年2月17日14时36分12秒****** /
ALTER TABLE [DBO]。[链接] WITH CHECK约束ADD [FK_Link_Node_Endpoint2]外键([端点2])
参考文献[DBO]。[节点]([节点ID] )
GO
ALTER TABLE [DBO]。[链接] CHECK约束[FK_Link_Node_Endpoint2]
GO

EDMX:

 < XML版本=1.0编码=UTF-8 ?> 
< EDMX:EDMX版本=1.0的xmlns:EDMX =http://schemas.microsoft.com/ado/2007/06/edmx>
<! - EF运行时的内容 - >
< EDMX:运行>
<! - SSDL内容 - >
< EDMX:StorageModels>
<模式命名空间=GraphModel.Store别名=自我提供程序=System.Data.SqlClient的ProviderManifestToken =2005的xmlns:店=http://schemas.microsoft.com/ado/ 2007/12 / EDM / EntityStoreSchemaGenerator的xmlns =http://schemas.microsoft.com/ado/2006/04/edm/ssdl>
< EntityContainer相关NAME =GraphModelStoreContainer>
< EntitySet的名称=链接的EntityType =GraphModel.Store.Link店:TYPE =表模式=DBO/>
< EntitySet的名称=节点的EntityType =GraphModel.Store.Node店:TYPE =表模式=DBO/>
< AssociationSet NAME =FK_Link_Node_Endpoint1公会=GraphModel.Store.FK_Link_Node_Endpoint1>
<作用到底=节点的EntitySet =节点/>
<作用到底=链接的EntitySet =链接/>
< / AssociationSet>
< AssociationSet NAME =FK_Link_Node_Endpoint2公会=GraphModel.Store.FK_Link_Node_Endpoint2>
<作用到底=节点的EntitySet =节点/>
<作用到底=链接的EntitySet =链接/>
< / AssociationSet>
< / EntityContainer相关>
<的EntityType名称=链接>
<关键>
< PropertyRef NAME =链路ID/>
< / Key与GT;
<属性名=链路IDTYPE =INT可空=假/>
<属性名=LinkTypeDiscriminatorTYPE =INT可空=假/>
<属性名=端点1TYPE =INT可空=假/>
<属性名=端点2TYPE =INT可空=假/>
<属性名称=名称TYPE =VARCHARMAXLENGTH =255/>
<属性名称=说明TYPE =VARCHARMAXLENGTH =1023/>
< /&的EntityType GT;
<的EntityType名称=节点>
<关键>
< PropertyRef NAME =节点ID/>
< / Key与GT;
<属性名=节点IDTYPE =INT可空=假/>
<属性名=NodeTypeDiscriminatorTYPE =INT可空=假/>
<属性名称=名称TYPE =VARCHAR可空=假MAXLENGTH =255/>
<属性名称=说明TYPE =VARCHARMAXLENGTH =1023/>
< /&的EntityType GT;
<协会名称=FK_Link_Node_Endpoint1>
<作用到底=节点TYPE =GraphModel.Store.Node多重=1/>
<作用到底=链接TYPE =GraphModel.Store.Link多重=*/>
< ReferentialConstraint>
<校长角色=节点>
< PropertyRef NAME =节点ID/>
< /首席>
<从属角色=链接>
< PropertyRef NAME =端点1/>
< /依赖型GT;
< / ReferentialConstraint>
< /协会>
<协会名称=FK_Link_Node_Endpoint2>
<作用到底=节点TYPE =GraphModel.Store.Node多重=1/>
<作用到底=链接TYPE =GraphModel.Store.Link多重=*/>
< ReferentialConstraint>
<校长角色=节点>
< PropertyRef NAME =节点ID/>
< /首席>
<从属角色=链接>
< PropertyRef NAME =端点2/>
< /依赖型GT;
< / ReferentialConstraint>
< /协会>
< /模式>
< / EDMX:StorageModels>
<! - CSDL内容 - >
< EDMX:ConceptualModels>
<模式的xmlns =http://schemas.microsoft.com/ado/2006/04/edm命名空间=而GraphModel别名=自我>
< EntityContainer相关NAME =GraphModelContainer>
< EntitySet的名称=节点集的EntityType =GraphModel.Node/>
< EntitySet的名称=LINKSET的EntityType =GraphModel.Link/>
< AssociationSet NAME =PersonPersonToPerson公会=GraphModel.PersonPersonToPerson>
<作用到底=人的EntitySet =节点集/>
<作用到底=PersonToPerson的EntitySet =LINKSET/>
< / AssociationSet>
< AssociationSet NAME =PersonPersonToPerson1公会=GraphModel.PersonPersonToPerson1>
<作用到底=人的EntitySet =节点集/>
<作用到底=PersonToPerson的EntitySet =LINKSET/>
< / AssociationSet>
< AssociationSet NAME =Person_PersonToLocation公会=GraphModel.Person_PersonToLocation>
<作用到底=人的EntitySet =节点集/>
<作用到底=PersonToLocation的EntitySet =LINKSET/>
< / AssociationSet>
< AssociationSet NAME =Location_PersonToLocation公会=GraphModel.Location_PersonToLocation>
<作用到底=位置的EntitySet =节点集/>
<作用到底=PersonToLocation的EntitySet =LINKSET/>
< / AssociationSet>
< / EntityContainer相关>
<的EntityType名称=节点摘要=真>
<关键>
< PropertyRef NAME =节点Id/>
< / Key与GT;
<属性名=节点IdTYPE =的Int32可空=假/>
<属性名=姓名类型=字符串可空=假/>
<属性名称=说明类型=字符串可空=真/>
< /&的EntityType GT;
<的EntityType名称=人BASETYPE =GraphModel.Node>
< NavigationProperty名称=领导者的关系=GraphModel.PersonPersonToPersonFromRole =人ToRole =PersonToPerson/>
< NavigationProperty NAME =追随者的关系=GraphModel.PersonPersonToPerson1FromRole =人ToRole =PersonToPerson/>
< NavigationProperty名称=位置的关系=GraphModel.Person_PersonToLocationFromRole =人ToRole =PersonToLocation/>
< /&的EntityType GT;
<的EntityType名称=位置BASETYPE =GraphModel.Node>
< NavigationProperty NAME =访问者关系=GraphModel.Location_PersonToLocationFromRole =位置ToRole =PersonToLocation/>
< /&的EntityType GT;
<的EntityType名称=链接摘要=真>
<关键>
< PropertyRef NAME =LINKID/>
< / Key与GT;
<属性名=LINKIDTYPE =的Int32可空=假/>
<属性名=姓名类型=字符串可空=真/>
<属性名称=说明类型=字符串可空=真/>
< /&的EntityType GT;
<的EntityType名称=PersonToPersonBASETYPE =GraphModel.Link>
< NavigationProperty NAME =领袖的关系=GraphModel.PersonPersonToPersonFromRole =PersonToPersonToRole =人/>
< NavigationProperty NAME =跟随的关系=GraphModel.PersonPersonToPerson1FromRole =PersonToPersonToRole =人/>
< /&的EntityType GT;
<的EntityType名称=PersonToLocationBASETYPE =GraphModel.Link>
< NavigationProperty名称=人的关系=GraphModel.Person_PersonToLocationFromRole =PersonToLocationToRole =人/>
< NavigationProperty名称=位置的关系=GraphModel.Location_PersonToLocationFromRole =PersonToLocationToRole =位置/>
< /&的EntityType GT;
<协会名称=PersonPersonToPerson>
<结束类型=GraphModel.Person角色=人多重=1/>
<结束类型=GraphModel.PersonToPerson角色=PersonToPerson多重=*/>
< /协会>
<协会名称=PersonPersonToPerson1>
<结束类型=GraphModel.Person角色=人多重=1/>
<结束类型=GraphModel.PersonToPerson角色=PersonToPerson多重=*/>
< /协会>
<协会名称=Person_PersonToLocation>
<结束类型=GraphModel.Person角色=人多重=1/>
<结束类型=GraphModel.PersonToLocation角色=PersonToLocation多重=*/>
< /协会>
<协会名称=Location_PersonToLocation>
<结束类型=GraphModel.Location角色=位置多重=1/>
<结束类型=GraphModel.PersonToLocation角色=PersonToLocation多重=*/>
< /协会>
< /模式>
< / EDMX:ConceptualModels>
<! - C-S映射内容 - >
< EDMX:映射>
<映射的xmlns =瓮:架构 - 微软COM:窗口:存储:映射:CS空间=C-S>
<别名重点=模型VALUE =而GraphModel/>
<别名重点=目标值=GraphModel.Store/>
< EntityContainerMapping CdmEntityContainer =GraphModelContainerStorageEntityContainer =GraphModelStoreContainer>
< EntitySetMapping NAME =LINKSET>
< EntityTypeMapping类型名=IsTypeOf(GraphModel.Link)>
< MappingFragment StoreEntitySet =链接>
< ScalarProperty名称=说明的ColumnName =说明/>
< ScalarProperty名称=名称的ColumnName =名称/>
< ScalarProperty NAME =LINKID的ColumnName =链路ID/>
< / MappingFragment>
< / EntityTypeMapping>
< EntityTypeMapping类型名=IsTypeOf(GraphModel.PersonToPerson)>
< MappingFragment StoreEntitySet =链接>
< ScalarProperty NAME =LINKID的ColumnName =链路ID/>
<条件的ColumnName =LinkTypeDiscriminatorVALUE =1/>
< / MappingFragment>
< / EntityTypeMapping>
< EntityTypeMapping类型名=IsTypeOf(GraphModel.PersonToLocation)>
< MappingFragment StoreEntitySet =链接>
< ScalarProperty NAME =LINKID的ColumnName =链路ID/>
<条件的ColumnName =LinkTypeDiscriminatorVALUE =2/>
< / MappingFragment>
< / EntityTypeMapping>
< / EntitySetMapping>
< EntitySetMapping NAME =节点集>
< EntityTypeMapping类型名=IsTypeOf(GraphModel.Node)>
< MappingFragment StoreEntitySet =节点>
< ScalarProperty名称=说明的ColumnName =说明/>
< ScalarProperty名称=名称的ColumnName =名称/>
< ScalarProperty NAME =节点Id的ColumnName =节点ID/>
< / MappingFragment>
< / EntityTypeMapping>
< EntityTypeMapping类型名=IsTypeOf(GraphModel.Person)>
< MappingFragment StoreEntitySet =节点>
< ScalarProperty NAME =节点Id的ColumnName =节点ID/>
<条件的ColumnName =NodeTypeDiscriminatorVALUE =1/>
< / MappingFragment>
< / EntityTypeMapping>
< EntityTypeMapping类型名=IsTypeOf(GraphModel.Location)>
< MappingFragment StoreEntitySet =节点>
< ScalarProperty NAME =节点Id的ColumnName =节点ID/>
<条件的ColumnName =NodeTypeDiscriminatorVALUE =2/>
< / MappingFragment>
< / EntityTypeMapping>
< / EntitySetMapping>
< AssociationSetMapping NAME =PersonPersonToPerson1的TypeName =GraphModel.PersonPersonToPerson1StoreEntitySet =链接>
< EndProperty名称=人>
< ScalarProperty NAME =节点Id的ColumnName =端点1/>
< / EndProperty>
< EndProperty NAME =PersonToPerson>
< ScalarProperty NAME =LINKID的ColumnName =链路ID/>
< / EndProperty>
<条件的ColumnName =端点1ISNULL =FALSE/>
< / AssociationSetMapping>
< AssociationSetMapping NAME =PersonPersonToPerson的TypeName =GraphModel.PersonPersonToPersonStoreEntitySet =链接>
< EndProperty名称=人>
< ScalarProperty NAME =节点Id的ColumnName =端点2/>
< / EndProperty>
< EndProperty NAME =PersonToPerson>
< ScalarProperty NAME =LINKID的ColumnName =链路ID/>
< / EndProperty>
<条件的ColumnName =端点2ISNULL =FALSE/>
< / AssociationSetMapping>
< AssociationSetMapping NAME =Person_PersonToLocation的TypeName =GraphModel.Person_PersonToLocationStoreEntitySet =链接>
< EndProperty名称=人>
< ScalarProperty NAME =节点Id的ColumnName =端点1/>
< / EndProperty>
< EndProperty NAME =PersonToLocation>
< ScalarProperty NAME =LINKID的ColumnName =链路ID/>
< / EndProperty>
<条件的ColumnName =端点1ISNULL =FALSE/>
< / AssociationSetMapping>
< AssociationSetMapping NAME =Location_PersonToLocation的TypeName =GraphModel.Location_PersonToLocationStoreEntitySet =链接>
< EndProperty名称=位置>
< ScalarProperty NAME =节点Id的ColumnName =端点2/>
< / EndProperty>
< EndProperty NAME =PersonToLocation>
< ScalarProperty NAME =LINKID的ColumnName =链路ID/>
< / EndProperty>
<条件的ColumnName =端点2ISNULL =FALSE/>
< / AssociationSetMapping>
< / EntityContainerMapping>
< /映射>
< / EDMX:映射>
< / EDMX:运行>
<! - EF设计内容(不要手动编辑BELOW HERE) - GT;
< EDMX:设计师的xmlns =http://schemas.microsoft.com/ado/2007/06/edmx>
< EDMX:连接>
< DesignerInfoPropertySet>
< DesignerProperty NAME =MetadataArtifactProcessingVALUE =EmbedInOutputAssembly/>
< / DesignerInfoPropertySet>
< / EDMX:连接>
< EDMX:选项>
< DesignerInfoPropertySet>
< DesignerProperty NAME =ValidateOnBuildVALUE =真/>
< / DesignerInfoPropertySet>
< / EDMX:选项>
<! - 图的内容(形状和连接器的位置) - GT;
< EDMX:图>
<图名称=而GraphModel缩放级别=114>
< EntityTypeShape的EntityType =GraphModel.NodeWIDTH =1.5PointX =5.875尖尖=1.375HEIGHT =1.427958984375/>
< EntityTypeShape的EntityType =GraphModel.PersonWIDTH =1.5PointX =5.875尖尖=3.25HEIGHT =1.4279589843749996/>
< EntityTypeShape的EntityType =GraphModel.LocationWIDTH =1.5PointX =7.75尖尖=4.625HEIGHT =1.0992643229166665/>
< InheritanceConnector的EntityType =GraphModel.Location>
< ConnectorPoint PointX =7.375尖尖=2.0889794921875/>
< ConnectorPoint PointX =8.5尖尖=2.0889794921875/>
< ConnectorPoint PointX =8.5尖尖=4.625/>
< / InheritanceConnector>
< EntityTypeShape的EntityType =GraphModel.LinkWIDTH =1.5PointX =2.875尖尖=1.375HEIGHT =1.427958984375/>
< EntityTypeShape的EntityType =GraphModel.PersonToPersonWIDTH =1.75PointX =2.625尖尖=3.125HEIGHT =0.9349169921875/>
< InheritanceConnector的EntityType =GraphModel.PersonToPerson>
< ConnectorPoint PointX =3.625尖尖=2.802958984375/>
< ConnectorPoint PointX =3.625尖尖=3.125/>
< / InheritanceConnector>
< InheritanceConnector的EntityType =GraphModel.Person>
< ConnectorPoint PointX =6.625尖尖=2.802958984375/>
< ConnectorPoint PointX =6.625尖尖=3.25/>
< / InheritanceConnector>
< EntityTypeShape的EntityType =GraphModel.PersonToLocationWIDTH =1.875PointX =0.75尖尖=4.625HEIGHT =1.2636116536458326/>
< InheritanceConnector的EntityType =GraphModel.PersonToLocation>
< ConnectorPoint PointX =2.875尖尖=2.0889794921875/>
< ConnectorPoint PointX =1.65625尖尖=2.0889794921875/>
< ConnectorPoint PointX =1.65625尖尖=4.625/>
< / InheritanceConnector>
< AssociationConnector协会=GraphModel.PersonPersonToPerson>
< ConnectorPoint PointX =5.875尖尖=3.8193058268229163/>
< ConnectorPoint PointX =4.375尖尖=3.8193058268229163/>
< / AssociationConnector>
< AssociationConnector协会=GraphModel.PersonPersonToPerson1>
< ConnectorPoint PointX =5.875尖尖=3.4721529134114579/>
< ConnectorPoint PointX =4.375尖尖=3.4721529134114579/>
< / AssociationConnector>
< AssociationConnector协会=GraphModel.Person_PersonToLocation>
< ConnectorPoint PointX =6.625尖尖=4.677958984375/>
< ConnectorPoint PointX =6.625尖尖=5.1875/>
< ConnectorPoint PointX =2.625尖尖=5.1875/>
< / AssociationConnector>
< AssociationConnector协会=GraphModel.Location_PersonToLocation>
< ConnectorPoint PointX =7.75尖尖=5.4791666666666661/>
< ConnectorPoint PointX =2.625尖尖=5.4791666666666661/>
< / AssociationConnector>
< /图>
< / EDMX:图>
< / EDMX:设计师>
< / EDMX:EDMX>


解决方案

可能的解决方法




  1. 创建的派生类型之间的每个关联一个单独的列,使这些列的可为空

  2. 的创建这些新列和主键表之间的外键。

  3. 地图在你的实体模型到一个特定的,唯一的列和外键的每个关联,以使每一列和外键只有使用一次。






问题



这是一个相当不希望的解决方案,因为它爆炸出需要的列数。




  • 更多列 - 在列数爆炸添加每个关联列派生类型结果之间

  • 空列在TPH的情况下,这意味着你将有很多的的列在表格中。

  • SQL JOIN - 从TPH到TPT开关,以避免在必要的空列结果的数量为EF,使用JOIN这将有极其频繁发生(几乎每次在处理任何派生类型)。

  • 重构如果您在将来添加一个派生类型,你不仅需要更新实体模型(*的.edmx)和它的映射,但你也将有通过增加额外的列来改变数据库架构!




示例



有关链接以上/节点为例,所产生的数据库模式是这样的:








代码



SQL

 使用[GraphExample2] 
GO
/ ******对象:表[DBO ] [节点]脚本日期:2009年2月26日15时45分53秒****** /
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
$ GO b $ b设置ANSI_PADDING ON
GO
CREATE TABLE [DBO]。[节点(
[节点ID] [INT] IDENTITY(1,1)NOT NULL,
[NodeTypeDiscriminator ] [INT] NOT NULL,
[名] [VARCHAR(255)NOT NULL,
[说明] [VARCHAR(1023)NULL,
约束[PK_Node] PRIMARY KEY CLUSTERED

[节点ID] ASC
)和(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]
)ON [ PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/ ******对象:表[DBO] [链接]脚本日期:2009年2月26日15: 45:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Link](
\t[LinkID] [int] IDENTITY(1,1) NOT NULL,
\t[LinkTypeDiscriminator] [int] NOT NULL,
\t[LeaderID] [ int] NULL,
\t[FollowerID] [int] NULL,
\t[PersonID] [int] NULL,
\t[LocationID] [int] NULL,
\t[Name] [varchar] (255) NULL,
\t[Description] [varchar](1023) NULL,
CONSTRAINT [PK_Link] PRIMARY KEY CLUSTERED
(
\t[LinkID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: ForeignKey [FK_Link_Node_Follower] Script Date: 02/26/2009 15:45:53 ******/
ALTER TABLE [dbo].[Link ] WITH CHECK ADD CONSTRAINT [FK_Link_Node_Follower] FOREIGN KEY([FollowerID])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Follower]
GO
/****** Object: ForeignKey [FK_Link_Node_Leader] Script Date: 02/26/2009 15:45:53 ******/ $b$ b ALTER TABLE [dbo].[Link] WITH CHECK ADD CONSTRAINT [FK_Link_Node_Leader] FOREIGN KEY([LeaderID])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Leader]
GO
/****** Object: ForeignKey [FK_Link_Node_Location] Script Date: 02/26/2009 15:45:53 * *****/
ALTER TABLE [dbo].[Link] WITH CHECK ADD CONSTRAINT [FK_Link_Node_Location] FOREIGN KEY([LocationID])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Location]
GO
/****** Object: ForeignKey [FK_Link_Node_Person] Script Date: 02/ 26/2009 15:45:53 ******/
ALTER TABLE [dbo].[Link] WITH CHECK ADD CONSTRAINT [FK_Link_Node_Person] FOREIGN KEY([PersonID])
REFERENCES [dbo] .[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Person]
GO

EDMX:

<?xml version=\"1.0 \" encoding=\"utf-8\"?> 
<edmx:Edmx Version=\"1.0\" xmlns:edmx=\"http://schemas.microsoft.com/ado/2007/06/edmx\">
<!-- EF Runtime content -->
<edmx:Runtime>
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace=\"GraphModel.Store\" Alias=\"Self\" Provider=\"System.Data.SqlClient\" ProviderManifestToken=\"2005\" xmlns:store=\"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator\" xmlns=\"http://schemas.microsoft.com/ado/2006/04/edm/ssdl\">
<EntityContainer Name=\"GraphModelStoreContainer\">
<EntitySet Name=\"Link\" EntityType=\"GraphModel.Store.Link\" store:Type=\"Tables\" Schema=\"dbo\" />
<EntitySet Name=\"Node\" EntityType=\"GraphModel.Store.Node\" store:Type=\"Tables\" Schema=\"dbo\" />
<AssociationSet Name=\"FK_Link_Node_Follower\" Association=\"GraphModel.Store.FK_Link_Node_Follower\">
<End Role=\"Node\" EntitySet=\"Node\" />
<End Role=\"Link\" EntitySet=\"Link\" />
</AssociationSet>
<AssociationSet Name=\"FK_Link_Node_Leader\" Association=\"GraphModel.Store.FK_Link_Node_Leader\">
<End Role=\"Node\" EntitySet=\"Node\" />
<End Role=\"Link\" EntitySet=\"Link\" />
</AssociationSet>
<AssociationSet Name=\"FK_Link_Node_Location\" Association=\"GraphModel.Store.FK_Link_Node_Location\">
<End Role=\"Node\" EntitySet=\"Node\" />
<End Role=\"Link\" EntitySet=\"Link\" />
</AssociationSet>
<AssociationSet Name=\"FK_Link_Node_Person\" Association=\"GraphModel.Store.FK_Link_Node_Person\">
<End Role=\"Node\" EntitySet=\"Node\" />
<End Role=\"Link\" EntitySet=\"Link\" />
</AssociationSet>
</EntityContainer>
<EntityType Name=\"Link\">
<Key>
<PropertyRef Name=\"LinkID\" />
</Key>
<Property Name=\"LinkID\" Type=\"int\" Nullable=\"false\" StoreGeneratedPattern=\"Identity\" />
<Property Name=\"LinkTypeDiscriminator\" Type=\"int\" Nullable=\"false\" />
<Property Name=\"LeaderID\" Type=\"int\" />
<Property Name=\"FollowerID\" Type=\"int\" />
<Property Name=\"PersonID\" Type=\"int\" />
<Property Name=\"LocationID\" Type=\"int\" />
<Property Name=\"Name\" Type=\"varchar\" MaxLength=\"255\" />
<Property Name=\"Description\" Type=\"varchar\" MaxLength=\"1023\" />
</EntityType>
<EntityType Name=\"Node\">
<Key>
<PropertyRef Name=\"NodeID\" />
</Key>
<Property Name=\"NodeID\" Type=\"int\" Nullable=\"false\" StoreGeneratedPattern=\"Identity\" />
<Property Name=\"NodeTypeDiscriminator\" Type=\"int\" Nullable=\"false\" />
<Property Name=\"Name\" Type=\"varchar\" Nullable=\"false\" MaxLength=\"255\" />
<Property Name=\"Description\" Type=\"varchar\" MaxLength=\"1023\" />
</EntityType>
<Association Name=\"FK_Link_Node_Follower\">
<End Role=\"Node\" Type=\"GraphModel.Store.Node\" Multiplicity=\"0..1\" />
<End Role=\"Link\" Type=\"GraphModel.Store.Link\" Multiplicity=\"*\" />
<ReferentialConstraint>
<Principal Role=\"Node\">
<PropertyRef Name=\"NodeID\" />
</Principal>
<Dependent Role=\"Link\">
<PropertyRef Name=\"FollowerID\" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name=\"FK_Link_Node_Leader\">
<End Role=\"Node\" Type=\"GraphModel.Store.Node\" Multiplicity=\"0..1\" />
<End Role=\"Link\" Type=\"GraphModel.Store.Link\" Multiplicity=\"*\" />
<ReferentialConstraint>
<Principal Role=\"Node\">
<PropertyRef Name=\"NodeID\" />
</Principal>
<Dependent Role=\"Link\">
<PropertyRef Name=\"LeaderID\" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name=\"FK_Link_Node_Location\">
<End Role=\"Node\" Type=\"GraphModel.Store.Node\" Multiplicity=\"0..1\" />
<End Role=\"Link\" Type=\"GraphModel.Store.Link\" Multiplicity=\"*\" />
<ReferentialConstraint>
<Principal Role=\"Node\">
<PropertyRef Name=\"NodeID\" />
</Principal>
<Dependent Role=\"Link\">
<PropertyRef Name=\"LocationID\" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name=\"FK_Link_Node_Person\">
<End Role=\"Node\" Type=\"GraphModel.Store.Node\" Multiplicity=\"0..1\" />
<End Role=\"Link\" Type=\"GraphModel.Store.Link\" Multiplicity=\"*\" />
<ReferentialConstraint>
<Principal Role=\"Node\">
<PropertyRef Name=\"NodeID\" />
</Principal>
<Dependent Role=\"Link\">
<PropertyRef Name=\"PersonID\" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
</edmx:StorageModels>
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema xmlns=\"http://schemas.microsoft.com/ado/2006/04/edm\" Namespace=\"GraphModel\" Alias=\"Self\">
<EntityContainer Name=\"GraphModelContainer\" >
<EntitySet Name=\"NodeSet\" EntityType=\"GraphModel.Node\" />
<EntitySet Name=\"LinkSet\" EntityType=\"GraphModel.Link\" />
<AssociationSet Name=\"PersonPersonToPerson_Leader\" Association=\"GraphModel.PersonPersonToPerson_Leader\">
<End Role=\"Person\" EntitySet=\"NodeSet\" />
<End Role=\"PersonToPerson\" EntitySet=\"LinkSet\" />
</AssociationSet>
<AssociationSet Name=\"PersonPersonToPerson_Follower\" Association=\"GraphModel.PersonPersonToPerson_Follower\">
<End Role=\"Person\" EntitySet=\"NodeSet\" />
<End Role=\"PersonToPerson\" EntitySet=\"LinkSet\" />
</AssociationSet>
<AssociationSet Name=\"Person_PersonToLocation\" Association=\"GraphModel.Person_PersonToLocation\">
<End Role=\"Person\" EntitySet=\"NodeSet\" />
<End Role=\"PersonToLocation\" EntitySet=\"LinkSet\" />
</AssociationSet>
<AssociationSet Name=\"Location_PersonToLocation\" Association=\"GraphModel.Location_PersonToLocation\">
<End Role=\"Location\" EntitySet=\"NodeSet\" />
<End Role=\"PersonToLocation\" EntitySet=\"LinkSet\" />
</AssociationSet>
</EntityContainer>
<EntityType Name=\"Node\" Abstract=\"true\">
<Key>
<PropertyRef Name=\"NodeId\" />
</Key>
<Property Name=\"NodeId\" Type=\"Int32\" Nullable=\"false\" />
<Property Name=\"Name\" Type=\"String\" Nullable=\"false\" />
<Property Name=\"Description\" Type=\"String\" Nullable=\"true\" />
</EntityType>
<EntityType Name=\"Person\" BaseType=\"GraphModel.Node\" >
<NavigationProperty Name=\"Leaders\" Relationship=\"GraphModel.PersonPersonToPerson_Leader\" FromRole=\"Person\" ToRole=\"PersonToPerson\" />
<NavigationProperty Name=\"Followers\" Relationship=\"GraphModel.PersonPersonToPerson_Follower\" FromRole=\"Person\" ToRole=\"PersonToPerson\" />
<NavigationProperty Name=\"Locations\" Relationship=\"GraphModel.Person_PersonToLocation\" FromRole=\"Person\" ToRole=\"PersonToLocation\" />
</EntityType>
<EntityType Name=\"Location\" BaseType=\"GraphModel.Node\" >
<NavigationProperty Name=\"Visitors\" Relationship=\"GraphModel.Location_PersonToLocation\" FromRole=\"Location\" ToRole=\"PersonToLocation\" />
</EntityType>
<EntityType Name=\"Link\" Abstract=\"true\">
<Key>
<PropertyRef Name=\"LinkId\" />
</Key>
<Property Name=\"LinkId\" Type=\"Int32\" Nullable=\"false\" />
<Property Name=\"Name\" Type=\"String\" Nullable=\"true\" />
<Property Name=\"Description\" Type=\"String\" Nullable=\"true\" />
</EntityType>
<EntityType Name=\"PersonToPerson\" BaseType=\"GraphModel.Link\" >
<NavigationProperty Name=\"Leader\" Relationship=\"GraphModel.PersonPersonToPerson_Leader\" FromRole=\"PersonToPerson\" ToRole=\"Person\" />
<NavigationProperty Name=\"Follower\" Relationship=\"GraphModel.PersonPersonToPerson_Follower\" FromRole=\"PersonToPerson\" ToRole=\"Person\" />
</EntityType>
<EntityType Name=\"PersonToLocation\" BaseType=\"GraphModel.Link\" >
<NavigationProperty Name=\"Person\" Relationship=\"GraphModel.Person_PersonToLocation\" FromRole=\"PersonToLocation\" ToRole=\"Person\" />
<NavigationProperty Name=\"Location\" Relationship=\"GraphModel.Location_PersonToLocation\" FromRole=\"PersonToLocation\" ToRole=\"Location\" />
</EntityType>
<Association Name=\"PersonPersonToPerson_Leader\">
<End Type=\"GraphModel.Person\" Role=\"Person\" Multiplicity=\"1\" />
<End Type=\"GraphModel.PersonToPerson\" Role=\"PersonToPerson\" Multiplicity=\"*\" />
</Association>
<Association Name=\"PersonPersonToPerson_Follower\">
<End Type=\"GraphModel.Person\" Role=\"Person\" Multiplicity=\"1\" />
<End Type=\"GraphModel.PersonToPerson\" Role=\"PersonToPerson\" Multiplicity=\"*\" />
</Association>
<Association Name=\"Person_PersonToLocation\">
<End Type=\"GraphModel.Person\" Role=\"Person\" Multiplicity=\"1\" />
<End Type=\"GraphModel.PersonToLocation\" Role=\"PersonToLocation\" Multiplicity=\"*\" />
</Association>
<Association Name=\"Location_PersonToLocation\">
<End Type=\"GraphModel.Location\" Role=\"Location\" Multiplicity=\"1\" />
<End Type=\"GraphModel.PersonToLocation\" Role=\"PersonToLocation\" Multiplicity=\"*\" />
</Association>
</Schema>
</edmx:ConceptualModels>
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping xmlns=\"urn:schemas-microsoft-com:windows:storage:mapping:CS\" Space=\"C-S\">
<Alias Key=\"Model\" Value=\"GraphModel\" />
<Alias Key=\"Target\" Value=\"GraphModel.Store\" />
<EntityContainerMapping CdmEntityContainer=\"GraphModelContainer\" StorageEntityContainer=\"GraphModelStoreContainer\">
<EntitySetMapping Name=\"LinkSet\">
<EntityTypeMapping TypeName=\"IsTypeOf(GraphModel.Link)\">
<MappingFragment StoreEntitySet=\"Link\">
<ScalarProperty Name=\"Description\" ColumnName=\"Description\" />
<ScalarProperty Name=\"Name\" ColumnName=\"Name\" />
<ScalarProperty Name=\"LinkId\" ColumnName=\"LinkID\" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName=\"IsTypeOf(GraphModel.PersonToPerson)\">
<MappingFragment StoreEntitySet=\"Link\" >
<ScalarProperty Name=\"LinkId\" ColumnName=\"LinkID\" />
<Condition ColumnName=\"LinkTypeDiscriminator\" Value=\"1\" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName=\"IsTypeOf(GraphModel.PersonToLocation)\">
<MappingFragment StoreEntitySet=\"Link\" >
<ScalarProperty Name=\"LinkId\" ColumnName=\"LinkID\" />
<Condition ColumnName=\"LinkTypeDiscriminator\" Value=\"2\" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name=\"NodeSet\">
<EntityTypeMapping TypeName=\"IsTypeOf(GraphModel.Node)\">
<MappingFragment StoreEntitySet=\"Node\">
<ScalarProperty Name=\"Description\" ColumnName=\"Description\" />
<ScalarProperty Name=\"Name\" ColumnName=\"Name\" />
<ScalarProperty Name=\"NodeId\" ColumnName=\"NodeID\" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName=\"IsTypeOf(GraphModel.Person)\">
<MappingFragment StoreEntitySet=\"Node\" >
<ScalarProperty Name=\"NodeId\" ColumnName=\"NodeID\" />
<Condition ColumnName=\"NodeTypeDiscriminator\" Value=\"1\" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName=\"IsTypeOf(GraphModel.Location)\">
<MappingFragment StoreEntitySet=\"Node\" >
<ScalarProperty Name=\"NodeId\" ColumnName=\"NodeID\" />
<Condition ColumnName=\"NodeTypeDiscriminator\" Value=\"2\" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<AssociationSetMapping Name=\"PersonPersonToPerson_Follower\" TypeName=\"GraphModel.PersonPersonToPerson_Follower\" StoreEntitySet=\"Link\">
<EndProperty Name=\"Person\">
<ScalarProperty Name=\"NodeId\" ColumnName=\"FollowerID\" />
</EndProperty>
<EndProperty Name=\"PersonToPerson\">
<ScalarProperty Name=\"LinkId\" ColumnName=\"LinkID\" />
</EndProperty>
</AssociationSetMapping>
<AssociationSetMapping Name=\"PersonPersonToPerson_Leader\" TypeName=\"GraphModel.PersonPersonToPerson_Leader\" StoreEntitySet=\"Link\">
<EndProperty Name=\"Person\">
<ScalarProperty Name=\"NodeId\" ColumnName=\"LeaderID\" />
</EndProperty>
<EndProperty Name=\"PersonToPerson\">
<ScalarProperty Name=\"LinkId\" ColumnName=\"LinkID\" />
</EndProperty>
</AssociationSetMapping>
<AssociationSetMapping Name=\"Person_PersonToLocation\" TypeName=\"GraphModel.Person_PersonToLocation\" StoreEntitySet=\"Link\">
<EndProperty Name=\"Person\">
<ScalarProperty Name=\"NodeId\" ColumnName=\"PersonID\" />
</EndProperty>
<EndProperty Name=\"PersonToLocation\">
<ScalarProperty Name=\"LinkId\" ColumnName=\"LinkID\" />
</EndProperty>
</AssociationSetMapping>
<AssociationSetMapping Name=\"Location_PersonToLocation\" TypeName=\"GraphModel.Location_PersonToLocation\" StoreEntitySet=\"Link\">
<EndProperty Name=\"Location\">
<ScalarProperty Name=\"NodeId\" ColumnName=\"LocationID\" />
</EndProperty>
<EndProperty Name=\"PersonToLocation\">
<ScalarProperty Name=\"LinkId\" ColumnName=\"LinkID\" />
</EndProperty>
</AssociationSetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>
<!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
<edmx:Designer xmlns=\"http://schemas.microsoft.com/ado/2007/06/edmx\">
<edmx:Connection>
<DesignerInfoPropertySet>
<DesignerProperty Name=\"MetadataArtifactProcessing\" Value=\"EmbedInOutputAssembly\" />
</DesignerInfoPropertySet>
</edmx:Connection>
<edmx:Options>
<DesignerInfoPropertySet>
<DesignerProperty Name=\"ValidateOnBuild\" Value=\"true\" />
</DesignerInfoPropertySet>
</edmx:Options>
<!-- Diagram content (shape and connector positions) -->
<edmx:Diagrams>
<Diagram Name=\"GraphModel\" ZoomLevel=\"114\" >
<EntityTypeShape EntityType=\"GraphModel.Node\" Width=\"1.5\" PointX=\"5.875\" PointY=\"1.375\" Height=\"1.427958984375\" />
<EntityTypeShape EntityType=\"GraphModel.Person\" Width=\"1.5\" PointX=\"5.875\" PointY=\"3.25\" Height=\"1.4279589843749996\" />
<EntityTypeShape EntityType=\"GraphModel.Location\" Width=\"1.5\" PointX=\"7.75\" PointY=\"4.625\" Height=\"1.0992643229166665\" />
<InheritanceConnector EntityType=\"GraphModel.Location\">
<ConnectorPoint PointX=\"7.375\" PointY=\"2.4176741536458342\" />
<ConnectorPoint PointX=\"8.5\" PointY=\"2.4176741536458342\" />
<ConnectorPoint PointX=\"8.5\" PointY=\"4.625\" />
</InheritanceConnector>
<EntityTypeShape EntityType=\"GraphModel.Link\" Width=\"1.5\" PointX=\"2.875\" PointY=\"1.375\" Height=\"1.427958984375\" />
<EntityTypeShape EntityType=\"GraphModel.PersonToPerson\" Width=\"1.75\" PointX=\"2.75\" PointY=\"3.25\" Height=\"1.2636116536458326\" />
<InheritanceConnector EntityType=\"GraphModel.PersonToPerson\" ManuallyRouted=\"false\">
<ConnectorPoint PointX=\"3.625\" PointY=\"2.802958984375\" />
<ConnectorPoint PointX=\"3.625\" PointY=\"3.25\" />
</InheritanceConnector>
<InheritanceConnector EntityType=\"GraphModel.Person\">
<ConnectorPoint PointX=\"6.625\" PointY=\"3.4603483072916683\" />
<ConnectorPoint PointX=\"6.625\" PointY=\"3.25\" />
</InheritanceConnector>
<EntityTypeShape EntityType=\"GraphModel.PersonToLocation\" Width=\"1.875\" PointX=\"0.75\" PointY=\"4.625\" Height=\"1.2636116536458326\" />
<InheritanceConnector EntityType=\"GraphModel.PersonToLocation\">
<ConnectorPoint PointX=\"2.875\" PointY=\"2.4176741536458342\" />
<ConnectorPoint PointX=\"1.65625\" PointY=\"2.4176741536458342\" />
<ConnectorPoint PointX=\"1.65625\" PointY=\"4.625\" />
</InheritanceConnector>
<AssociationConnector Association=\"GraphModel.PersonPersonToPerson_Leader\">
<ConnectorPoint PointX=\"5.875\" PointY=\"3.8818058268229163\" />
<ConnectorPoint PointX=\"4.5\" PointY=\"3.8818058268229163\" />
</AssociationConnector>
<AssociationConnector Association=\"GraphModel.PersonPersonToPerson_Follower\">
<ConnectorPoint PointX=\"5.875\" PointY=\"3.5034029134114579\" />
<ConnectorPoint PointX=\"4.5\" PointY=\"3.5034029134114579\" />
</AssociationConnector>
<AssociationConnector Association=\"GraphModel.Person_PersonToLocation\">
<ConnectorPoint PointX=\"6.625\" PointY=\"4.677958984375\" />
<ConnectorPoint PointX=\"6.625\" PointY=\"5.0078214863281243\" />
<ConnectorPoint PointX=\"2.625\" PointY=\"5.0078214863281243\" />
</AssociationConnector>
<AssociationConnector Association=\"GraphModel.Location_PersonToLocation\">
<ConnectorPoint PointX=\"7.75\" PointY=\"5.40018798828125\" />
<ConnectorPoint PointX=\"2.625\" PointY=\"5.40018798828125\" />
</AssociationConnector>
</Diagram>
</edmx:Diagrams>
</edmx:Designer>
</edmx:Edmx>


Background

I am writing a data access library using the ADO Entity Framework in Visual Studio 2008 SP1 using the .NET Framework 3.5 SP1. I am trying to create associations between two entities that are both derived from an abstract type. I am representing both entity inheritance hierarchies using Table Per Hierarchy (TPH) which means there are just two tables - one for each entity inheritance hierarchy.

NOTE You can use Table Per Type (TPT) to avoid this problem, but it comes with it's own drawbacks. See here and here for more details when choosing between inheritance persistence models.

Here is a screenshot of the Designer view of the Entity Model:

And here is a screenshot of the database schema:

Assumptions

When you create associations in the ADO Entity Framework Designer between derived types modeled with TPH using Visual Studio 2008 SP1 and the .NET Framework 3.5 SP1 you are likely to receive the following an "Error 3034: Two entities with different keys are mapped to the same row. Ensure these two mapping fragments do no map two groups of entities with overlapping keys to the same group of rows."

Based on what I have read online, in order to resolve this issue, you must add a Condition to the association on the Foreign Key like so:

<Condition ColumnName="Endpoint1" IsNull="false" />

Here's a screenshot of this edit for the PersonPersonToPerson1 association:

Constraints

  • The base classes of each hierarchy (i.e. Node and Link) must be abstract.
  • The navigation properties from the associations between two derived types must be distinguishable by link type (e.g. PersonToPerson and PersonToLocation). This means you cannot create the associations between the Link and Node abstract base classes.

Problem:

When I create the Entity Model as described above and add the Conditions to the AssociationMappings as described in the Assumptions above, I receive an "Error 3023" when I build/validate the model.

Error   1   Error 3023: Problem in Mapping Fragments starting at lines 146, 153, 159, 186, 195, 204, 213: Column Link.Endpoint1 has no default value and is not nullable. A column value is required to store entity data.
An Entity with Key (PK) will not round-trip when:
((PK is NOT in 'LinkSet' EntitySet OR PK does NOT play Role 'PersonToPerson' in AssociationSet 'PersonPersonToPerson1') AND (PK is in 'LinkSet' EntitySet OR PK plays Role 'PersonToPerson' in AssociationSet 'PersonPersonToPerson1' OR PK plays Role 'PersonToPerson' in AssociationSet 'PersonPersonToPerson'))
C:\Documents and Settings\Demo\My Documents\Visual Studio 2008\Projects\GraphExample2.BusinessEntities\GraphExample2.BusinessEntities\GraphModel.edmx   147 15  GraphExample2.BusinessEntities

The thing that the Entity Framework is getting hung up on in the above scenario is that there are two properties being mapped on to the same foreign keys. For example, the column and foreign key for Endpoint1 is mapped to the Person property in the PersonToLocation derived type and it's mapped to the Leader property in the PersonToPerson derived type.

I don't understand why this is an issue. Since the Leader/Follower Properties are only in the PersonToPerson derived type - not any other derived type or base type - and the same is true of the Person/Location property, why isn't the TypeDiscriminator field sufficient for the EF to figure out which set a given row belongs in?

To me it seems like, if you are dealing with an object where TypeDiscriminator = 1, you place Endpoint1 in Leader and Endpoint2 in Follower. Likewise, if you are dealing with an object where TypeDiscriminator = 2, you place Endpoint1 in Person and Endpoint2 in Location.

Question:

How do you resolve the Error 3023 to allow these associations to occur ?

OR

How do you create the type of associations in the ADO Entity Framework that I have described above?

References:

Code

SQL:

USE [GraphExample2]
GO
/****** Object:  Table [dbo].[Node]    Script Date: 02/17/2009 14:36:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Node](
    [NodeID] [int] NOT NULL,
    [NodeTypeDiscriminator] [int] NOT NULL,
    [Name] [varchar](255) NOT NULL,
    [Description] [varchar](1023) NULL,
 CONSTRAINT [PK_Node] PRIMARY KEY CLUSTERED 
(
    [NodeID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Link]    Script Date: 02/17/2009 14:36:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Link](
    [LinkID] [int] NOT NULL,
    [LinkTypeDiscriminator] [int] NOT NULL,
    [Endpoint1] [int] NOT NULL,
    [Endpoint2] [int] NOT NULL,
    [Name] [varchar](255) NULL,
    [Description] [varchar](1023) NULL,
 CONSTRAINT [PK_Link] PRIMARY KEY CLUSTERED 
(
    [LinkID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  ForeignKey [FK_Link_Node_Endpoint1]    Script Date: 02/17/2009 14:36:12 ******/
ALTER TABLE [dbo].[Link]  WITH CHECK ADD  CONSTRAINT [FK_Link_Node_Endpoint1] FOREIGN KEY([Endpoint1])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Endpoint1]
GO
/****** Object:  ForeignKey [FK_Link_Node_Endpoint2]    Script Date: 02/17/2009 14:36:12 ******/
ALTER TABLE [dbo].[Link]  WITH CHECK ADD  CONSTRAINT [FK_Link_Node_Endpoint2] FOREIGN KEY([Endpoint2])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Endpoint2]
GO

EDMX:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="GraphModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
        <EntityContainer Name="GraphModelStoreContainer">
          <EntitySet Name="Link" EntityType="GraphModel.Store.Link" store:Type="Tables" Schema="dbo" />
          <EntitySet Name="Node" EntityType="GraphModel.Store.Node" store:Type="Tables" Schema="dbo" />
          <AssociationSet Name="FK_Link_Node_Endpoint1" Association="GraphModel.Store.FK_Link_Node_Endpoint1">
            <End Role="Node" EntitySet="Node" />
            <End Role="Link" EntitySet="Link" />
          </AssociationSet>
          <AssociationSet Name="FK_Link_Node_Endpoint2" Association="GraphModel.Store.FK_Link_Node_Endpoint2">
            <End Role="Node" EntitySet="Node" />
            <End Role="Link" EntitySet="Link" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Link">
          <Key>
            <PropertyRef Name="LinkID" />
          </Key>
          <Property Name="LinkID" Type="int" Nullable="false" />
          <Property Name="LinkTypeDiscriminator" Type="int" Nullable="false" />
          <Property Name="Endpoint1" Type="int" Nullable="false" />
          <Property Name="Endpoint2" Type="int" Nullable="false" />
          <Property Name="Name" Type="varchar" MaxLength="255" />
          <Property Name="Description" Type="varchar" MaxLength="1023" />
        </EntityType>
        <EntityType Name="Node">
          <Key>
            <PropertyRef Name="NodeID" />
          </Key>
          <Property Name="NodeID" Type="int" Nullable="false" />
          <Property Name="NodeTypeDiscriminator" Type="int" Nullable="false" />
          <Property Name="Name" Type="varchar" Nullable="false" MaxLength="255" />
          <Property Name="Description" Type="varchar" MaxLength="1023" />
        </EntityType>
        <Association Name="FK_Link_Node_Endpoint1">
          <End Role="Node" Type="GraphModel.Store.Node" Multiplicity="1" />
          <End Role="Link" Type="GraphModel.Store.Link" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Node">
              <PropertyRef Name="NodeID" />
            </Principal>
            <Dependent Role="Link">
              <PropertyRef Name="Endpoint1" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
        <Association Name="FK_Link_Node_Endpoint2">
          <End Role="Node" Type="GraphModel.Store.Node" Multiplicity="1" />
          <End Role="Link" Type="GraphModel.Store.Link" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Node">
              <PropertyRef Name="NodeID" />
            </Principal>
            <Dependent Role="Link">
              <PropertyRef Name="Endpoint2" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema>
    </edmx:StorageModels>
    <!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema xmlns="http://schemas.microsoft.com/ado/2006/04/edm" Namespace="GraphModel" Alias="Self">
        <EntityContainer Name="GraphModelContainer" >
          <EntitySet Name="NodeSet" EntityType="GraphModel.Node" />
          <EntitySet Name="LinkSet" EntityType="GraphModel.Link" />
          <AssociationSet Name="PersonPersonToPerson" Association="GraphModel.PersonPersonToPerson">
            <End Role="Person" EntitySet="NodeSet" />
            <End Role="PersonToPerson" EntitySet="LinkSet" />
          </AssociationSet>
          <AssociationSet Name="PersonPersonToPerson1" Association="GraphModel.PersonPersonToPerson1">
            <End Role="Person" EntitySet="NodeSet" />
            <End Role="PersonToPerson" EntitySet="LinkSet" />
          </AssociationSet>
          <AssociationSet Name="Person_PersonToLocation" Association="GraphModel.Person_PersonToLocation">
            <End Role="Person" EntitySet="NodeSet" />
            <End Role="PersonToLocation" EntitySet="LinkSet" />
          </AssociationSet>
          <AssociationSet Name="Location_PersonToLocation" Association="GraphModel.Location_PersonToLocation">
            <End Role="Location" EntitySet="NodeSet" />
            <End Role="PersonToLocation" EntitySet="LinkSet" />
          </AssociationSet>
        </EntityContainer>
        <EntityType Name="Node" Abstract="true">
          <Key>
            <PropertyRef Name="NodeId" />
          </Key>
          <Property Name="NodeId" Type="Int32" Nullable="false" />
          <Property Name="Name" Type="String" Nullable="false" />
          <Property Name="Description" Type="String" Nullable="true" />
        </EntityType>
        <EntityType Name="Person" BaseType="GraphModel.Node" >
          <NavigationProperty Name="Leaders" Relationship="GraphModel.PersonPersonToPerson" FromRole="Person" ToRole="PersonToPerson" />
          <NavigationProperty Name="Followers" Relationship="GraphModel.PersonPersonToPerson1" FromRole="Person" ToRole="PersonToPerson" />
          <NavigationProperty Name="Locations" Relationship="GraphModel.Person_PersonToLocation" FromRole="Person" ToRole="PersonToLocation" />
        </EntityType>
        <EntityType Name="Location" BaseType="GraphModel.Node" >
          <NavigationProperty Name="Visitors" Relationship="GraphModel.Location_PersonToLocation" FromRole="Location" ToRole="PersonToLocation" />
        </EntityType>
        <EntityType Name="Link" Abstract="true">
          <Key>
            <PropertyRef Name="LinkId" />
          </Key>
          <Property Name="LinkId" Type="Int32" Nullable="false" />
          <Property Name="Name" Type="String" Nullable="true" />
          <Property Name="Description" Type="String" Nullable="true" />
        </EntityType>
        <EntityType Name="PersonToPerson" BaseType="GraphModel.Link" >
          <NavigationProperty Name="Leader" Relationship="GraphModel.PersonPersonToPerson" FromRole="PersonToPerson" ToRole="Person" />
          <NavigationProperty Name="Follower" Relationship="GraphModel.PersonPersonToPerson1" FromRole="PersonToPerson" ToRole="Person" />
        </EntityType>
        <EntityType Name="PersonToLocation" BaseType="GraphModel.Link" >
          <NavigationProperty Name="Person" Relationship="GraphModel.Person_PersonToLocation" FromRole="PersonToLocation" ToRole="Person" />
          <NavigationProperty Name="Location" Relationship="GraphModel.Location_PersonToLocation" FromRole="PersonToLocation" ToRole="Location" />
        </EntityType>
        <Association Name="PersonPersonToPerson">
          <End Type="GraphModel.Person" Role="Person" Multiplicity="1" />
          <End Type="GraphModel.PersonToPerson" Role="PersonToPerson" Multiplicity="*" />
        </Association>
        <Association Name="PersonPersonToPerson1">
          <End Type="GraphModel.Person" Role="Person" Multiplicity="1" />
          <End Type="GraphModel.PersonToPerson" Role="PersonToPerson" Multiplicity="*" />
        </Association>
        <Association Name="Person_PersonToLocation">
          <End Type="GraphModel.Person" Role="Person" Multiplicity="1" />
          <End Type="GraphModel.PersonToLocation" Role="PersonToLocation" Multiplicity="*" />
        </Association>
        <Association Name="Location_PersonToLocation">
          <End Type="GraphModel.Location" Role="Location" Multiplicity="1" />
          <End Type="GraphModel.PersonToLocation" Role="PersonToLocation" Multiplicity="*" />
        </Association>
      </Schema>
    </edmx:ConceptualModels>
    <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS" Space="C-S">
        <Alias Key="Model" Value="GraphModel" />
        <Alias Key="Target" Value="GraphModel.Store" />
        <EntityContainerMapping CdmEntityContainer="GraphModelContainer" StorageEntityContainer="GraphModelStoreContainer">
          <EntitySetMapping Name="LinkSet">
            <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Link)">
              <MappingFragment StoreEntitySet="Link">
                <ScalarProperty Name="Description" ColumnName="Description" />
                <ScalarProperty Name="Name" ColumnName="Name" />
                <ScalarProperty Name="LinkId" ColumnName="LinkID" />
              </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(GraphModel.PersonToPerson)">
              <MappingFragment StoreEntitySet="Link" >
                <ScalarProperty Name="LinkId" ColumnName="LinkID" />
                <Condition ColumnName="LinkTypeDiscriminator" Value="1" />
              </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(GraphModel.PersonToLocation)">
              <MappingFragment StoreEntitySet="Link" >
                <ScalarProperty Name="LinkId" ColumnName="LinkID" />
                <Condition ColumnName="LinkTypeDiscriminator" Value="2" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
          <EntitySetMapping Name="NodeSet">
            <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Node)">
              <MappingFragment StoreEntitySet="Node">
                <ScalarProperty Name="Description" ColumnName="Description" />
                <ScalarProperty Name="Name" ColumnName="Name" />
                <ScalarProperty Name="NodeId" ColumnName="NodeID" />
              </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Person)">
              <MappingFragment StoreEntitySet="Node" >
                <ScalarProperty Name="NodeId" ColumnName="NodeID" />
                <Condition ColumnName="NodeTypeDiscriminator" Value="1" />
              </MappingFragment>
            </EntityTypeMapping>
            <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Location)">
              <MappingFragment StoreEntitySet="Node" >
                <ScalarProperty Name="NodeId" ColumnName="NodeID" />
                <Condition ColumnName="NodeTypeDiscriminator" Value="2" />
              </MappingFragment>
            </EntityTypeMapping>
          </EntitySetMapping>
          <AssociationSetMapping Name="PersonPersonToPerson1" TypeName="GraphModel.PersonPersonToPerson1" StoreEntitySet="Link">
            <EndProperty Name="Person">
              <ScalarProperty Name="NodeId" ColumnName="Endpoint1" />
            </EndProperty>
            <EndProperty Name="PersonToPerson">
              <ScalarProperty Name="LinkId" ColumnName="LinkID" />
            </EndProperty>
            <Condition ColumnName="Endpoint1" IsNull="false" />
          </AssociationSetMapping>
          <AssociationSetMapping Name="PersonPersonToPerson" TypeName="GraphModel.PersonPersonToPerson" StoreEntitySet="Link">
            <EndProperty Name="Person">
              <ScalarProperty Name="NodeId" ColumnName="Endpoint2" />
            </EndProperty>
            <EndProperty Name="PersonToPerson">
              <ScalarProperty Name="LinkId" ColumnName="LinkID" />
            </EndProperty>
            <Condition ColumnName="Endpoint2" IsNull="false" />
          </AssociationSetMapping>
          <AssociationSetMapping Name="Person_PersonToLocation" TypeName="GraphModel.Person_PersonToLocation" StoreEntitySet="Link">
            <EndProperty Name="Person">
              <ScalarProperty Name="NodeId" ColumnName="Endpoint1" />
            </EndProperty>
            <EndProperty Name="PersonToLocation">
              <ScalarProperty Name="LinkId" ColumnName="LinkID" />
            </EndProperty>
            <Condition ColumnName="Endpoint1" IsNull="false" />
          </AssociationSetMapping>
          <AssociationSetMapping Name="Location_PersonToLocation" TypeName="GraphModel.Location_PersonToLocation" StoreEntitySet="Link">
            <EndProperty Name="Location">
              <ScalarProperty Name="NodeId" ColumnName="Endpoint2" />
            </EndProperty>
            <EndProperty Name="PersonToLocation">
              <ScalarProperty Name="LinkId" ColumnName="LinkID" />
            </EndProperty>
            <Condition ColumnName="Endpoint2" IsNull="false" />
          </AssociationSetMapping>
        </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>
  </edmx:Runtime>
  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2007/06/edmx">
    <edmx:Connection>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
      </DesignerInfoPropertySet>
    </edmx:Connection>
    <edmx:Options>
      <DesignerInfoPropertySet>
        <DesignerProperty Name="ValidateOnBuild" Value="true" />
      </DesignerInfoPropertySet>
    </edmx:Options>
    <!-- Diagram content (shape and connector positions) -->
    <edmx:Diagrams>
      <Diagram Name="GraphModel" ZoomLevel="114" >
        <EntityTypeShape EntityType="GraphModel.Node" Width="1.5" PointX="5.875" PointY="1.375" Height="1.427958984375" />
        <EntityTypeShape EntityType="GraphModel.Person" Width="1.5" PointX="5.875" PointY="3.25" Height="1.4279589843749996" />
        <EntityTypeShape EntityType="GraphModel.Location" Width="1.5" PointX="7.75" PointY="4.625" Height="1.0992643229166665" />
        <InheritanceConnector EntityType="GraphModel.Location">
          <ConnectorPoint PointX="7.375" PointY="2.0889794921875" />
          <ConnectorPoint PointX="8.5" PointY="2.0889794921875" />
          <ConnectorPoint PointX="8.5" PointY="4.625" />
        </InheritanceConnector>
        <EntityTypeShape EntityType="GraphModel.Link" Width="1.5" PointX="2.875" PointY="1.375" Height="1.427958984375" />
        <EntityTypeShape EntityType="GraphModel.PersonToPerson" Width="1.75" PointX="2.625" PointY="3.125" Height="0.9349169921875" />
        <InheritanceConnector EntityType="GraphModel.PersonToPerson">
          <ConnectorPoint PointX="3.625" PointY="2.802958984375" />
          <ConnectorPoint PointX="3.625" PointY="3.125" />
        </InheritanceConnector>
        <InheritanceConnector EntityType="GraphModel.Person">
          <ConnectorPoint PointX="6.625" PointY="2.802958984375" />
          <ConnectorPoint PointX="6.625" PointY="3.25" />
        </InheritanceConnector>
        <EntityTypeShape EntityType="GraphModel.PersonToLocation" Width="1.875" PointX="0.75" PointY="4.625" Height="1.2636116536458326" />
        <InheritanceConnector EntityType="GraphModel.PersonToLocation">
          <ConnectorPoint PointX="2.875" PointY="2.0889794921875" />
          <ConnectorPoint PointX="1.65625" PointY="2.0889794921875" />
          <ConnectorPoint PointX="1.65625" PointY="4.625" />
        </InheritanceConnector>
        <AssociationConnector Association="GraphModel.PersonPersonToPerson">
          <ConnectorPoint PointX="5.875" PointY="3.8193058268229163" />
          <ConnectorPoint PointX="4.375" PointY="3.8193058268229163" />
        </AssociationConnector>
        <AssociationConnector Association="GraphModel.PersonPersonToPerson1">
          <ConnectorPoint PointX="5.875" PointY="3.4721529134114579" />
          <ConnectorPoint PointX="4.375" PointY="3.4721529134114579" />
        </AssociationConnector>
        <AssociationConnector Association="GraphModel.Person_PersonToLocation">
          <ConnectorPoint PointX="6.625" PointY="4.677958984375" />
          <ConnectorPoint PointX="6.625" PointY="5.1875" />
          <ConnectorPoint PointX="2.625" PointY="5.1875" />
        </AssociationConnector>
        <AssociationConnector Association="GraphModel.Location_PersonToLocation">
          <ConnectorPoint PointX="7.75" PointY="5.4791666666666661" />
          <ConnectorPoint PointX="2.625" PointY="5.4791666666666661" />
        </AssociationConnector>
      </Diagram>
    </edmx:Diagrams>
  </edmx:Designer>
</edmx:Edmx>

解决方案

Possible Workaround

  1. Create a separate column for each association between derived types and make each of these columns nullable
  2. Create a foreign key between each of these new columns and the primary key table.
  3. Map each association in your Entity Model to a specific, unique column and foreign key so that each column and foreign key is only used once.


Problems

This is quite an undesirable solution because it explodes out the number of columns you need.

  • More Columns - Adding a column for each association between derived types results in an explosion on the number of columns.
  • Empty Columns In the case of TPH, it means you'll have a lot of empty columns in your table.
  • SQL JOIN - Switching from TPH to TPT to avoid the number of empty columns results in the necessity for EF to use a JOIN which will have to occur extremely frequently (almost every time you deal with any of the derived types).
  • Refactoring If you add a derived type in the future, you not only have to update your Entity model (*.edmx) and the it's mapping but you will also have to change the database schema by adding additional columns!

Example

For the Link/Node example above, the resulting database schema would look like this:


Code

SQL:

USE [GraphExample2]
GO
/****** Object:  Table [dbo].[Node]    Script Date: 02/26/2009 15:45:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Node](
	[NodeID] [int] IDENTITY(1,1) NOT NULL,
	[NodeTypeDiscriminator] [int] NOT NULL,
	[Name] [varchar](255) NOT NULL,
	[Description] [varchar](1023) NULL,
 CONSTRAINT [PK_Node] PRIMARY KEY CLUSTERED 
(
	[NodeID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Link]    Script Date: 02/26/2009 15:45:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Link](
	[LinkID] [int] IDENTITY(1,1) NOT NULL,
	[LinkTypeDiscriminator] [int] NOT NULL,
	[LeaderID] [int] NULL,
	[FollowerID] [int] NULL,
	[PersonID] [int] NULL,
	[LocationID] [int] NULL,
	[Name] [varchar](255) NULL,
	[Description] [varchar](1023) NULL,
 CONSTRAINT [PK_Link] PRIMARY KEY CLUSTERED 
(
	[LinkID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  ForeignKey [FK_Link_Node_Follower]    Script Date: 02/26/2009 15:45:53 ******/
ALTER TABLE [dbo].[Link]  WITH CHECK ADD  CONSTRAINT [FK_Link_Node_Follower] FOREIGN KEY([FollowerID])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Follower]
GO
/****** Object:  ForeignKey [FK_Link_Node_Leader]    Script Date: 02/26/2009 15:45:53 ******/
ALTER TABLE [dbo].[Link]  WITH CHECK ADD  CONSTRAINT [FK_Link_Node_Leader] FOREIGN KEY([LeaderID])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Leader]
GO
/****** Object:  ForeignKey [FK_Link_Node_Location]    Script Date: 02/26/2009 15:45:53 ******/
ALTER TABLE [dbo].[Link]  WITH CHECK ADD  CONSTRAINT [FK_Link_Node_Location] FOREIGN KEY([LocationID])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Location]
GO
/****** Object:  ForeignKey [FK_Link_Node_Person]    Script Date: 02/26/2009 15:45:53 ******/
ALTER TABLE [dbo].[Link]  WITH CHECK ADD  CONSTRAINT [FK_Link_Node_Person] FOREIGN KEY([PersonID])
REFERENCES [dbo].[Node] ([NodeID])
GO
ALTER TABLE [dbo].[Link] CHECK CONSTRAINT [FK_Link_Node_Person]
GO

EDMX:

<?xml version="1.0" encoding="utf-8"?>
  <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
    <!-- EF Runtime content -->
    <edmx:Runtime>
      <!-- SSDL content -->
      <edmx:StorageModels>
        <Schema Namespace="GraphModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
          <EntityContainer Name="GraphModelStoreContainer">
            <EntitySet Name="Link" EntityType="GraphModel.Store.Link" store:Type="Tables" Schema="dbo" />
            <EntitySet Name="Node" EntityType="GraphModel.Store.Node" store:Type="Tables" Schema="dbo" />
            <AssociationSet Name="FK_Link_Node_Follower" Association="GraphModel.Store.FK_Link_Node_Follower">
              <End Role="Node" EntitySet="Node" />
              <End Role="Link" EntitySet="Link" />
            </AssociationSet>
            <AssociationSet Name="FK_Link_Node_Leader" Association="GraphModel.Store.FK_Link_Node_Leader">
              <End Role="Node" EntitySet="Node" />
              <End Role="Link" EntitySet="Link" />
            </AssociationSet>
            <AssociationSet Name="FK_Link_Node_Location" Association="GraphModel.Store.FK_Link_Node_Location">
              <End Role="Node" EntitySet="Node" />
              <End Role="Link" EntitySet="Link" />
            </AssociationSet>
            <AssociationSet Name="FK_Link_Node_Person" Association="GraphModel.Store.FK_Link_Node_Person">
              <End Role="Node" EntitySet="Node" />
              <End Role="Link" EntitySet="Link" />
            </AssociationSet>
          </EntityContainer>
          <EntityType Name="Link">
            <Key>
              <PropertyRef Name="LinkID" />
            </Key>
            <Property Name="LinkID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
            <Property Name="LinkTypeDiscriminator" Type="int" Nullable="false" />
            <Property Name="LeaderID" Type="int" />
            <Property Name="FollowerID" Type="int" />
            <Property Name="PersonID" Type="int" />
            <Property Name="LocationID" Type="int" />
            <Property Name="Name" Type="varchar" MaxLength="255" />
            <Property Name="Description" Type="varchar" MaxLength="1023" />
          </EntityType>
          <EntityType Name="Node">
            <Key>
              <PropertyRef Name="NodeID" />
            </Key>
            <Property Name="NodeID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
            <Property Name="NodeTypeDiscriminator" Type="int" Nullable="false" />
            <Property Name="Name" Type="varchar" Nullable="false" MaxLength="255" />
            <Property Name="Description" Type="varchar" MaxLength="1023" />
          </EntityType>
          <Association Name="FK_Link_Node_Follower">
            <End Role="Node" Type="GraphModel.Store.Node" Multiplicity="0..1" />
            <End Role="Link" Type="GraphModel.Store.Link" Multiplicity="*" />
            <ReferentialConstraint>
              <Principal Role="Node">
                <PropertyRef Name="NodeID" />
              </Principal>
              <Dependent Role="Link">
                <PropertyRef Name="FollowerID" />
              </Dependent>
            </ReferentialConstraint>
          </Association>
          <Association Name="FK_Link_Node_Leader">
            <End Role="Node" Type="GraphModel.Store.Node" Multiplicity="0..1" />
            <End Role="Link" Type="GraphModel.Store.Link" Multiplicity="*" />
            <ReferentialConstraint>
              <Principal Role="Node">
                <PropertyRef Name="NodeID" />
              </Principal>
              <Dependent Role="Link">
                <PropertyRef Name="LeaderID" />
              </Dependent>
            </ReferentialConstraint>
          </Association>
          <Association Name="FK_Link_Node_Location">
            <End Role="Node" Type="GraphModel.Store.Node" Multiplicity="0..1" />
            <End Role="Link" Type="GraphModel.Store.Link" Multiplicity="*" />
            <ReferentialConstraint>
              <Principal Role="Node">
                <PropertyRef Name="NodeID" />
              </Principal>
              <Dependent Role="Link">
                <PropertyRef Name="LocationID" />
              </Dependent>
            </ReferentialConstraint>
          </Association>
          <Association Name="FK_Link_Node_Person">
            <End Role="Node" Type="GraphModel.Store.Node" Multiplicity="0..1" />
            <End Role="Link" Type="GraphModel.Store.Link" Multiplicity="*" />
            <ReferentialConstraint>
              <Principal Role="Node">
                <PropertyRef Name="NodeID" />
              </Principal>
              <Dependent Role="Link">
                <PropertyRef Name="PersonID" />
              </Dependent>
            </ReferentialConstraint>
          </Association>
        </Schema>
      </edmx:StorageModels>
      <!-- CSDL content -->
      <edmx:ConceptualModels>
        <Schema xmlns="http://schemas.microsoft.com/ado/2006/04/edm" Namespace="GraphModel" Alias="Self">
          <EntityContainer Name="GraphModelContainer" >
            <EntitySet Name="NodeSet" EntityType="GraphModel.Node" />
            <EntitySet Name="LinkSet" EntityType="GraphModel.Link" />
            <AssociationSet Name="PersonPersonToPerson_Leader" Association="GraphModel.PersonPersonToPerson_Leader">
              <End Role="Person" EntitySet="NodeSet" />
              <End Role="PersonToPerson" EntitySet="LinkSet" />
            </AssociationSet>
            <AssociationSet Name="PersonPersonToPerson_Follower" Association="GraphModel.PersonPersonToPerson_Follower">
              <End Role="Person" EntitySet="NodeSet" />
              <End Role="PersonToPerson" EntitySet="LinkSet" />
            </AssociationSet>
            <AssociationSet Name="Person_PersonToLocation" Association="GraphModel.Person_PersonToLocation">
              <End Role="Person" EntitySet="NodeSet" />
              <End Role="PersonToLocation" EntitySet="LinkSet" />
            </AssociationSet>
            <AssociationSet Name="Location_PersonToLocation" Association="GraphModel.Location_PersonToLocation">
              <End Role="Location" EntitySet="NodeSet" />
              <End Role="PersonToLocation" EntitySet="LinkSet" />
            </AssociationSet>
          </EntityContainer>
          <EntityType Name="Node" Abstract="true">
            <Key>
              <PropertyRef Name="NodeId" />
            </Key>
            <Property Name="NodeId" Type="Int32" Nullable="false" />
            <Property Name="Name" Type="String" Nullable="false" />
            <Property Name="Description" Type="String" Nullable="true" />
          </EntityType>
          <EntityType Name="Person" BaseType="GraphModel.Node" >
            <NavigationProperty Name="Leaders" Relationship="GraphModel.PersonPersonToPerson_Leader" FromRole="Person" ToRole="PersonToPerson" />
            <NavigationProperty Name="Followers" Relationship="GraphModel.PersonPersonToPerson_Follower" FromRole="Person" ToRole="PersonToPerson" />
            <NavigationProperty Name="Locations" Relationship="GraphModel.Person_PersonToLocation" FromRole="Person" ToRole="PersonToLocation" />
          </EntityType>
          <EntityType Name="Location" BaseType="GraphModel.Node" >
            <NavigationProperty Name="Visitors" Relationship="GraphModel.Location_PersonToLocation" FromRole="Location" ToRole="PersonToLocation" />
          </EntityType>
          <EntityType Name="Link" Abstract="true">
            <Key>
              <PropertyRef Name="LinkId" />
            </Key>
            <Property Name="LinkId" Type="Int32" Nullable="false" />
            <Property Name="Name" Type="String" Nullable="true" />
            <Property Name="Description" Type="String" Nullable="true" />
          </EntityType>
          <EntityType Name="PersonToPerson" BaseType="GraphModel.Link" >
            <NavigationProperty Name="Leader" Relationship="GraphModel.PersonPersonToPerson_Leader" FromRole="PersonToPerson" ToRole="Person" />
            <NavigationProperty Name="Follower" Relationship="GraphModel.PersonPersonToPerson_Follower" FromRole="PersonToPerson" ToRole="Person" />
          </EntityType>
          <EntityType Name="PersonToLocation" BaseType="GraphModel.Link" >
            <NavigationProperty Name="Person" Relationship="GraphModel.Person_PersonToLocation" FromRole="PersonToLocation" ToRole="Person" />
            <NavigationProperty Name="Location" Relationship="GraphModel.Location_PersonToLocation" FromRole="PersonToLocation" ToRole="Location" />
          </EntityType>
          <Association Name="PersonPersonToPerson_Leader">
            <End Type="GraphModel.Person" Role="Person" Multiplicity="1" />
            <End Type="GraphModel.PersonToPerson" Role="PersonToPerson" Multiplicity="*" />
          </Association>
          <Association Name="PersonPersonToPerson_Follower">
            <End Type="GraphModel.Person" Role="Person" Multiplicity="1" />
            <End Type="GraphModel.PersonToPerson" Role="PersonToPerson" Multiplicity="*" />
          </Association>
          <Association Name="Person_PersonToLocation">
            <End Type="GraphModel.Person" Role="Person" Multiplicity="1" />
            <End Type="GraphModel.PersonToLocation" Role="PersonToLocation" Multiplicity="*" />
          </Association>
          <Association Name="Location_PersonToLocation">
            <End Type="GraphModel.Location" Role="Location" Multiplicity="1" />
            <End Type="GraphModel.PersonToLocation" Role="PersonToLocation" Multiplicity="*" />
          </Association>
        </Schema>
      </edmx:ConceptualModels>
      <!-- C-S mapping content -->
      <edmx:Mappings>
        <Mapping xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS" Space="C-S">
          <Alias Key="Model" Value="GraphModel" />
          <Alias Key="Target" Value="GraphModel.Store" />
          <EntityContainerMapping CdmEntityContainer="GraphModelContainer" StorageEntityContainer="GraphModelStoreContainer">
            <EntitySetMapping Name="LinkSet">
              <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Link)">
                <MappingFragment StoreEntitySet="Link">
                  <ScalarProperty Name="Description" ColumnName="Description" />
                  <ScalarProperty Name="Name" ColumnName="Name" />
                  <ScalarProperty Name="LinkId" ColumnName="LinkID" />
                </MappingFragment>
              </EntityTypeMapping>
              <EntityTypeMapping TypeName="IsTypeOf(GraphModel.PersonToPerson)">
                <MappingFragment StoreEntitySet="Link" >
                  <ScalarProperty Name="LinkId" ColumnName="LinkID" />
                  <Condition ColumnName="LinkTypeDiscriminator" Value="1" />
                </MappingFragment>
              </EntityTypeMapping>
              <EntityTypeMapping TypeName="IsTypeOf(GraphModel.PersonToLocation)">
                <MappingFragment StoreEntitySet="Link" >
                  <ScalarProperty Name="LinkId" ColumnName="LinkID" />
                  <Condition ColumnName="LinkTypeDiscriminator" Value="2" />
                </MappingFragment>
              </EntityTypeMapping>
            </EntitySetMapping>
            <EntitySetMapping Name="NodeSet">
              <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Node)">
                <MappingFragment StoreEntitySet="Node">
                  <ScalarProperty Name="Description" ColumnName="Description" />
                  <ScalarProperty Name="Name" ColumnName="Name" />
                  <ScalarProperty Name="NodeId" ColumnName="NodeID" />
                </MappingFragment>
              </EntityTypeMapping>
              <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Person)">
                <MappingFragment StoreEntitySet="Node" >
                  <ScalarProperty Name="NodeId" ColumnName="NodeID" />
                  <Condition ColumnName="NodeTypeDiscriminator" Value="1" />
                </MappingFragment>
              </EntityTypeMapping>
              <EntityTypeMapping TypeName="IsTypeOf(GraphModel.Location)">
                <MappingFragment StoreEntitySet="Node" >
                  <ScalarProperty Name="NodeId" ColumnName="NodeID" />
                  <Condition ColumnName="NodeTypeDiscriminator" Value="2" />
                </MappingFragment>
              </EntityTypeMapping>
            </EntitySetMapping>
            <AssociationSetMapping Name="PersonPersonToPerson_Follower" TypeName="GraphModel.PersonPersonToPerson_Follower" StoreEntitySet="Link">
              <EndProperty Name="Person">
                <ScalarProperty Name="NodeId" ColumnName="FollowerID" />
              </EndProperty>
              <EndProperty Name="PersonToPerson">
                <ScalarProperty Name="LinkId" ColumnName="LinkID" />
              </EndProperty>
            </AssociationSetMapping>
            <AssociationSetMapping Name="PersonPersonToPerson_Leader" TypeName="GraphModel.PersonPersonToPerson_Leader" StoreEntitySet="Link">
              <EndProperty Name="Person">
                <ScalarProperty Name="NodeId" ColumnName="LeaderID" />
              </EndProperty>
              <EndProperty Name="PersonToPerson">
                <ScalarProperty Name="LinkId" ColumnName="LinkID" />
              </EndProperty>
            </AssociationSetMapping>
            <AssociationSetMapping Name="Person_PersonToLocation" TypeName="GraphModel.Person_PersonToLocation" StoreEntitySet="Link">
              <EndProperty Name="Person">
                <ScalarProperty Name="NodeId" ColumnName="PersonID" />
              </EndProperty>
              <EndProperty Name="PersonToLocation">
                <ScalarProperty Name="LinkId" ColumnName="LinkID" />
              </EndProperty>
            </AssociationSetMapping>
            <AssociationSetMapping Name="Location_PersonToLocation" TypeName="GraphModel.Location_PersonToLocation" StoreEntitySet="Link">
              <EndProperty Name="Location">
                <ScalarProperty Name="NodeId" ColumnName="LocationID" />
              </EndProperty>
              <EndProperty Name="PersonToLocation">
                <ScalarProperty Name="LinkId" ColumnName="LinkID" />
              </EndProperty>
            </AssociationSetMapping>
          </EntityContainerMapping>
        </Mapping>
      </edmx:Mappings>
    </edmx:Runtime>
    <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
    <edmx:Designer xmlns="http://schemas.microsoft.com/ado/2007/06/edmx">
      <edmx:Connection>
        <DesignerInfoPropertySet>
          <DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
        </DesignerInfoPropertySet>
      </edmx:Connection>
      <edmx:Options>
        <DesignerInfoPropertySet>
          <DesignerProperty Name="ValidateOnBuild" Value="true" />
        </DesignerInfoPropertySet>
      </edmx:Options>
      <!-- Diagram content (shape and connector positions) -->
      <edmx:Diagrams>
        <Diagram Name="GraphModel" ZoomLevel="114" >
          <EntityTypeShape EntityType="GraphModel.Node" Width="1.5" PointX="5.875" PointY="1.375" Height="1.427958984375" />
          <EntityTypeShape EntityType="GraphModel.Person" Width="1.5" PointX="5.875" PointY="3.25" Height="1.4279589843749996" />
          <EntityTypeShape EntityType="GraphModel.Location" Width="1.5" PointX="7.75" PointY="4.625" Height="1.0992643229166665" />
          <InheritanceConnector EntityType="GraphModel.Location">
            <ConnectorPoint PointX="7.375" PointY="2.4176741536458342" />
            <ConnectorPoint PointX="8.5" PointY="2.4176741536458342" />
            <ConnectorPoint PointX="8.5" PointY="4.625" />
          </InheritanceConnector>
          <EntityTypeShape EntityType="GraphModel.Link" Width="1.5" PointX="2.875" PointY="1.375" Height="1.427958984375" />
          <EntityTypeShape EntityType="GraphModel.PersonToPerson" Width="1.75" PointX="2.75" PointY="3.25" Height="1.2636116536458326" />
          <InheritanceConnector EntityType="GraphModel.PersonToPerson" ManuallyRouted="false">
            <ConnectorPoint PointX="3.625" PointY="2.802958984375" />
            <ConnectorPoint PointX="3.625" PointY="3.25" />
          </InheritanceConnector>
          <InheritanceConnector EntityType="GraphModel.Person">
            <ConnectorPoint PointX="6.625" PointY="3.4603483072916683" />
            <ConnectorPoint PointX="6.625" PointY="3.25" />
          </InheritanceConnector>
          <EntityTypeShape EntityType="GraphModel.PersonToLocation" Width="1.875" PointX="0.75" PointY="4.625" Height="1.2636116536458326" />
          <InheritanceConnector EntityType="GraphModel.PersonToLocation">
            <ConnectorPoint PointX="2.875" PointY="2.4176741536458342" />
            <ConnectorPoint PointX="1.65625" PointY="2.4176741536458342" />
            <ConnectorPoint PointX="1.65625" PointY="4.625" />
          </InheritanceConnector>
          <AssociationConnector Association="GraphModel.PersonPersonToPerson_Leader">
            <ConnectorPoint PointX="5.875" PointY="3.8818058268229163" />
            <ConnectorPoint PointX="4.5" PointY="3.8818058268229163" />
          </AssociationConnector>
          <AssociationConnector Association="GraphModel.PersonPersonToPerson_Follower">
            <ConnectorPoint PointX="5.875" PointY="3.5034029134114579" />
            <ConnectorPoint PointX="4.5" PointY="3.5034029134114579" />
          </AssociationConnector>
          <AssociationConnector Association="GraphModel.Person_PersonToLocation">
            <ConnectorPoint PointX="6.625" PointY="4.677958984375" />
            <ConnectorPoint PointX="6.625" PointY="5.0078214863281243" />
            <ConnectorPoint PointX="2.625" PointY="5.0078214863281243" />
          </AssociationConnector>
          <AssociationConnector Association="GraphModel.Location_PersonToLocation">
            <ConnectorPoint PointX="7.75" PointY="5.40018798828125" />
            <ConnectorPoint PointX="2.625" PointY="5.40018798828125" />
          </AssociationConnector>
        </Diagram>
      </edmx:Diagrams>
    </edmx:Designer>
  </edmx:Edmx>

这篇关于ADO EF - 错误的TPH派生类型之间的关联映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆