ADO EF - 错误映射TPH中派生类型之间的关联

时间:2009-02-17 19:55:28

标签: c# entity-framework orm

背景

我正在使用.NET Framework 3.5 SP1在Visual Studio 2008 SP1中使用ADO实体框架编写数据访问库。我试图在两个实体之间创建关联,这两个实体都是从抽象类型派生的。我使用Table Per Hierarchy(TPH)表示两个实体继承层次结构,这意味着只有两个表 - 每个实体继承层次结构一个。

注意您可以使用每种类型的表(TPT)来避免此问题,但它带来了它自身的缺点。在继承持久性模型之间进行选择时,请参阅herehere以获取更多详细信息。

以下是实体模型的Designer视图的屏幕截图:

 Design View of the Entity Model in Visual Studio 2008 SP1

以下是数据库架构的屏幕截图:

Database Schema

假设

使用Visual Studio 2008 SP1和.NET Framework 3.5 SP1在使用TPH建模的派生类型之间在ADO实体框架设计器中创建关联时,您可能会收到以下内容“错误3034:映射了具有不同键的两个实体确保这两个映射片段不会将具有重叠键的两组实体映射到同一组行。“

根据我的read online,为了解决这个问题,您必须在外键上为关联添加一个条件,如下所示:

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

以下是PersonPersonToPerson1关联的编辑截图:

 Visual Studio 2008 SP1 Editing of GraphModel.edmx

约束

  • 每个层次结构的基类(即节点和链接)必须是抽象的。
  • 两个派生类型之间的关联的导航属性必须可以通过链接类型区分(例如PersonToPerson和PersonToLocation)。这意味着无法创建链接和节点抽象基类之间的关联。

问题:

当我按上述假设中所述创建实体模型并将条件添加到AssociationMappings时,我在构建/验证模型时收到“错误3023”。

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

实体框架在上面的场景中被挂起的东西是有两个属性被映射到相同的外键。例如,Endpoint1的列和外键映射到PersonToLocation派生类型中的Person属性,并且它映射到PersonToPerson派生类型中的Leader属性。

我不明白为什么这是一个问题。由于Leader / Follower属性仅在PersonToPerson派生类型中 - 不是任何其他派生类型或基本类型 - 并且Person / Location属性也是如此,为什么TypeDiscriminator字段不足以让EF找出哪个设置一个给定的行属于?

对我而言,似乎如果您正在处理TypeDiscriminator = 1的对象,则将Endpoint1置于Leader中,将Endpoint2置于Follower中。同样,如果您正在处理TypeDiscriminator = 2的对象,则将Endpoint1放在Person中,将Endpoint2放在Location中。

问题:

如何解决错误3023以允许发生这些关联?

OR

如何在我上面描述的ADO实体框架中创建关联类型?

参考文献:

代码

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>

3 个答案:

答案 0 :(得分:6)

可能的解决方法

  1. 为派生类型之间的每个关联创建一个单独的列,并使每个列可以为空
  2. 在每个新列和主键表之间创建一个外键。
  3. 将实体模型中的每个关联映射到特定的唯一列和外键,以便每列和外键仅使用一次。

  4. 问题

    这是一个非常不合适的解决方案,因为它会爆炸出你需要的列数。

    • 更多列 - 为派生类型之间的每个关联添加列会导致列数爆炸。
    • 空列对于TPH,这意味着您的表中会有很多列。
    • SQL JOIN - 从TPH切换到TPT以避免空列的数量导致EF必须使用JOIN,这必须非常频繁地发生(几乎每次处理任何时候)衍生类型)。
    • 重构如果您将来添加派生类型,则不仅需要更新实体模型(* .edmx)及其映射,还必须通过以下方式更改数据库架构:添加其他列!

    实施例

    对于上面的链接/节点示例,生成的数据库架构如下所示:

    GraphExample Workaround Database Schema


    代码

    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>
    

答案 1 :(得分:1)

的AoA!

EntityModelCodeGenerator在两个表之间创建 0..1到多个关系, 使其 1到多

在这种情况下,它可能是一种可能的解决方案。

最诚挚的问候! 萨拉赫丁

答案 2 :(得分:0)