Множественное наследование с Entity Framework с TPH - PullRequest
1 голос
/ 12 января 2010

В дополнение к этому вопросу: Entity Framework TPH с множественным абстрактным наследованием и 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

Я видел 3034 ошибок во время моих путешествий в EF. Но обычно они относятся к навигационным свойствам. Я не видел таких ошибок в наследстве.

Вот мой 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 ]

4 голосов
/ 07 августа 2013

Я знаю, что этот вопрос давным-давно, но я потратил много времени на исследование аналогичной проблемы в недавнем приключении с EF 5.0 (и 6.0.0-бета1), и эта статья привела меня к правильное решение. Спасибо автору.

У меня сложная иерархия, сопоставленная с использованием 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 голос
/ 12 января 2010

Вы, похоже, пытаетесь выполнить сопоставление таблицы на иерархию (потому что я вижу только одну таблицу в вашем SSDL), но я не вижу, чтобы вы настроили сопоставление дискриминатора в CSDL. Должен быть узел условия, например:

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

Короче говоря, если вы пытаетесь использовать таблицу для сопоставления иерархии, вам следует ознакомиться с инструкциями по настройке этого и следовать им, потому что вы не выполнили все шаги.

Если, с другой стороны, вы намереваетесь выполнять сопоставление таблиц по типам, то, по-видимому, вы пропустили несколько таблиц при обновлении из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...