代码之家  ›  专栏  ›  技术社区  ›  itchi

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

  •  1
  • itchi  · 技术社区  · 16 年前

    关于这个问题: Entity Framework TPH with multiple abstract inheritance 与2008 sp1.NET3.5c相比#

    我知道错误:

    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
    

    我在英孚的旅行中经常看到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 回复  |  直到 8 年前
        1
  •  4
  •   Oren A    6 年前

    我知道这个问题由来已久,但我花了很长时间在最近的一次EF 5.0(和6.0.0-beta1)的冒险中研究了一个类似的问题,并且 this article 让我找到了一个有效的解决方案。感谢作者。

    • A1号 - -C1类
    • A1号 地下一层 -指挥控制
    • - 地下二层
    • A1号 - 地下二层
    • A1号 - -碳五
    • - - C6号 D1号 -E1级
    • - 地下二层 - C6号 - D1号
    • - - C6号 D1号 -E3级
    • - 地下二层 - C6号 D2级 -E4级
    • A1号 地下二层 C6号 - -E5型
    • A1号 地下二层 C6号 - D2级
    • A1号 地下二层 - C6号 D3号 -E7号
    • A1号 地下二层 - C6号 - D3号
    • A1号 - - C6号 D3号 -E9号

    大胆的 表示抽象,并且 指示特定于该类(和子类)到同一表(当然)的其他映射。

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

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

    希望这能帮助别人。

        2
  •  1
  •   Craig Stuntz    16 年前

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

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