具有TPH的实体框架的多重继承

时间:2010-01-12 00:25:00

标签: entity-framework table-per-hierarchy

继续这个问题: Entity Framework TPH with multiple abstract inheritance和VS.2008 sp1 .net 3.5 c#

我决定添加组织和学校。组织(摘要)继承自党,而学校(具体)继承自组织。

我收到错误:

Error   1   Error 3034: Problem in Mapping Fragments starting at lines 73, 93: Two entities with different keys are mapped to the same row. Ensure these two mapping fragments do not map two groups of entities with different keys to the same group of rows.
    C:\Users\xxx\Documents\Visual Studio 2008\Projects\TEST\TEST\Model1.edmx    74  29  TEST

我在EF的旅行中看到了3034个错误。但通常它们与导航属性有关。我没有在遗传方面看到这样的错误。

这是我的edmx xml:

<?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="test_1Model.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="test_1ModelStoreContainer">
                    <EntitySet Name="Student" EntityType="test_1Model.Store.Student"
              store:Type="Tables" Schema="dbo" />
                </EntityContainer>
                <EntityType Name="Student">
                    <Key>
                        <PropertyRef Name="Id" />
                    </Key>
                    <Property Name="Id" Type="int" Nullable="false"
              StoreGeneratedPattern="Identity" />
                    <Property Name="PartyInfo" Type="varchar(max)" Nullable="false" />
                    <Property Name="PersonInfo" Type="varchar(max)" Nullable="true" />
                    <Property Name="StudInfo" Type="varchar(max)" Nullable="true" />
                    <Property Name="OrgInfo" Type="varchar(max)" Nullable="true" />
                    <Property Name="SchoolInfo" Type="varchar(max)" Nullable="true" />
                    <Property Name="TypeOfParty" Type="varchar(max)" Nullable="false" />
                </EntityType>
            </Schema>
        </edmx:StorageModels>
        <!-- CSDL content -->
        <edmx:ConceptualModels>
            <Schema Namespace="test_1Model" Alias="Self"
          xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
                <EntityContainer Name="test_Entities">
                    <EntitySet Name="PartySet" EntityType="test_1Model.Party" />
                </EntityContainer>
                <EntityType Name="Party" Abstract="true">
                    <Key>
                        <PropertyRef Name="Id" />
                    </Key>
                    <Property Name="Id" Type="Int32" Nullable="false" />
                    <Property Name="PartyInfo" Type="String" Nullable="false"
              MaxLength="Max" Unicode="false" FixedLength="false" />
                </EntityType>
                <EntityType Name="Person" BaseType="test_1Model.Party" Abstract="true" >
                    <Property Name="PersonInfo" Type="String" Nullable="false" />
                </EntityType>
                <EntityType Name="Student" BaseType="test_1Model.Person" >
                    <Property Name="StudInfo" Type="String" Nullable="false" />
                </EntityType>
                <EntityType Name="Organization" BaseType="test_1Model.Party" Abstract="true" >
                    <Property Name="OrgInfo" Type="String" Nullable="false" />
                </EntityType>
                <EntityType Name="School" BaseType="test_1Model.Organization" >
                    <Property Name="SchoolInfo" Type="String" Nullable="false" />
                </EntityType>
            </Schema>
        </edmx:ConceptualModels>
        <!-- C-S mapping content -->
        <edmx:Mappings>
            <Mapping Space="C-S"
          xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
                <EntityContainerMapping
            StorageEntityContainer="test_1ModelStoreContainer"
            CdmEntityContainer="test_Entities">
                    <EntitySetMapping Name="PartySet">
                        <EntityTypeMapping TypeName="IsTypeOf(test_1Model.Party)">
                            <MappingFragment StoreEntitySet="Student">
                                <ScalarProperty Name="PartyInfo" ColumnName="PartyInfo" />
                                <ScalarProperty Name="Id" ColumnName="Id" />
                            </MappingFragment>
                        </EntityTypeMapping>
                        <EntityTypeMapping TypeName="IsTypeOf(test_1Model.Person)">
                            <MappingFragment StoreEntitySet="Student">
                                <ScalarProperty Name="Id" ColumnName="Id" />
                                <ScalarProperty Name="PersonInfo" ColumnName="PersonInfo" />
                            </MappingFragment>
                        </EntityTypeMapping>
                        <EntityTypeMapping TypeName="test_1Model.Student">
                            <MappingFragment StoreEntitySet="Student">
                                <ScalarProperty Name="Id" ColumnName="Id" />
                                <ScalarProperty Name="StudInfo" ColumnName="StudInfo" />
                                <ScalarProperty Name="PersonInfo" ColumnName="PersonInfo" />
                                <ScalarProperty Name="PartyInfo" ColumnName="PartyInfo" />
                                <Condition ColumnName="TypeOfParty" Value="STUDENT" />
                            </MappingFragment>
                        </EntityTypeMapping>
                        <EntityTypeMapping TypeName="IsTypeOf(test_1Model.Organization)">
                            <MappingFragment StoreEntitySet="Student">
                                <ScalarProperty Name="Id" ColumnName="Id" />
                                <ScalarProperty Name="OrgInfo" ColumnName="OrgInfo" />
                            </MappingFragment>
                        </EntityTypeMapping>
                        <EntityTypeMapping TypeName="test_1Model.School">
                            <MappingFragment StoreEntitySet="Student">
                                <ScalarProperty Name="Id" ColumnName="Id" />
                                <ScalarProperty Name="OrgInfo" ColumnName="OrgInfo" />
                                <ScalarProperty Name="PartyInfo" ColumnName="PartyInfo" />
                                <ScalarProperty Name="SchoolInfo" ColumnName="SchoolInfo" />
                                <Condition ColumnName="TypeOfParty" Value="SCHOOL" />
                            </MappingFragment>
                        </EntityTypeMapping>
                    </EntitySetMapping>
                </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="SqlServer_Model" >
                <EntityTypeShape EntityType="test_1Model.Party" Width="1.5" PointX="1.25" PointY="3.25" Height="1.4033821614583326" />
                <InheritanceConnector EntityType="test_1Model.Person" ManuallyRouted="false">
                    <ConnectorPoint PointX="2" PointY="4.6533821614583326" />
                    <ConnectorPoint PointX="2" PointY="5.75" />
                </InheritanceConnector>
                <EntityTypeShape EntityType="test_1Model.Organization" Width="1.5" PointX="3.875" PointY="5.625" Height="1.2110807291666665" />
                <InheritanceConnector EntityType="test_1Model.Organization">
                    <ConnectorPoint PointX="2.75" PointY="3.9516910807291663" />
                    <ConnectorPoint PointX="4.625" PointY="3.9516910807291663" />
                    <ConnectorPoint PointX="4.625" PointY="5.625" />
                </InheritanceConnector>
                <EntityTypeShape EntityType="test_1Model.School" Width="1.5" PointX="3.875" PointY="7.875" Height="1.2110807291666657" />
                <InheritanceConnector EntityType="test_1Model.School">
                    <ConnectorPoint PointX="4.625" PointY="6.8360807291666665" />
                    <ConnectorPoint PointX="4.625" PointY="7.875" />
                </InheritanceConnector>
            </Diagram>
        </edmx:Diagrams>
    </edmx:Designer>
</edmx:Edmx>

2 个答案:

答案 0 :(得分:4)

我知道这个问题已经很久了,但是我花了很长时间研究了最近使用EF 5.0(和6.0.0-beta1)的冒险中的类似问题,而this article让我得到了一个有效的解决方案。感谢作者。

我有一个使用TPH映射的复杂层次结构:

  • A1 - B1 - C1
  • A1 - B1 - C2
  • A1 - B2 - C3
  • A1 - B2 - C4
  • A1 - B2 - C5
  • A1 - B2 - C6 - D1 - E1
  • A1 - B2 - C6 - D1 - E2
  • A1 - B2 - C6 - D1 - E3
  • A1 - B2 - C6 - D2 - E4
  • A1 - B2 - C6 - D2 - E5
  • A1 - B2 - C6 - D2 - E6
  • A1 - B2 - C6 - D3 - E7
  • A1 - B2 - C6 - D3 - E8
  • A1 - B2 - C6 - D3 - E9

粗体表示抽象,斜体表示特定于该类(和子类)的其他映射到同一个表(当然)。

基本上,解决方案是在表中创建4个鉴别器列,并将层次结构中的每个级别映射到不同的鉴别器列。请注意,B级及以下级别的抽象类也需要进行映射,并指定一个鉴别器值。

很多时候浪费在这上面,TPH的所有示例和文档似乎只涵盖了基础知识。在现实世界中,事情会变得复杂一些!

希望这有助于某人。

答案 1 :(得分:1)

您似乎正在尝试执行每层次表映射(因为我在SSDL中只看到一个表),但我没有看到您在CSDL中设置了一个鉴别器映射。应该有一个Condition节点,如下所示:

            <Condition ColumnName="NotificationType" Value="Announcement"/>

简而言之,如果您尝试使用每个层次结构映射表,则应查看配置此说明的说明并遵循它们,因为您尚未完成所有步骤。

另一方面,如果您打算按类型映射执行表,那么当您从数据库更新时,您似乎错过了几个表。

相关问题