Question

J'ai une table avec un PK int, on ne champ NULL, et deux champs de chaîne NULL.

Quand je vais et mettre en place un design de style TPH dans EF, je l'ai mis de cette façon:

Le type de niveau supérieur n'a que le PK et le champ NOT NULL.

Le premier niveau vérifie le premier champ nullable comme un discriminateur. Le type résultant non nul est abstrait. Je la carte en conséquence le champ.

Je le fais à nouveau pour le second champ, la cartographie à nouveau où non nul. Je mets annulable = false sur les champs I carte.

<EntitySetMapping Name="Items">
        <EntityTypeMapping TypeName="IsTypeOf(Model1.Item)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name="OtherID" ColumnName="OtherID" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.BothNullItem)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="FirstNullField" IsNull="true" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.FirstFieldNull)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <ScalarProperty Name=FirstNullField" ColumnName="FirstNullField" />
            <Condition ColumnName="FirstNullField" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem1)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
            <Condition ColumnName="NullField2" IsNull="true" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping TypeName="IsTypeOf(Model1.NotNullSubItem2)">
          <MappingFragment StoreEntitySet="Items">
            <ScalarProperty Name="ID" ColumnName="ID" />
             <ScalarProperty Name="NullField2" ColumnName="NullField2" />
             <Condition ColumnName="NullField2" IsNull="false" />
          </MappingFragment>
        </EntityTypeMapping>
</EntitySetMapping>

J'obtiens « deux entités avec des clés différentes sont mis en correspondance avec la même ligne. »

Je pense qu'il est peut-être parce que l'attribut non nul du premier élément ne reçoit pas hérité par les enfants.

J'ai créé un troisième type pour essayer de prendre soin du cas de NullField1 étant nul et NullField2 ne pas être nulle (ce qui ne se produira pas dans mon DB, j'ai une contrainte), mais même si je l'ai ajouté il doesn « t travail.

ajouter Explicitement la condition non nul sur l'une des 2 sous les enfants me oblige à cartographier la colonne, ce qui ne fonctionne toujours pas même si je mapper à une propriété étrangère.

Aucune des combinaisons de conditions pour "BothNullItem" fonctionne soit.

Toutes les idées?

Était-ce utile?

La solution

Welp, je fini par renoncer à essayer d'obtenir discriminateur colonnes de se propager par héritage, donc je créé 3 vues, un niveau supérieur, un pour le champ field1 nul et non nul autre, puis sur un champ non nul, je fais field2 la colonne discriminante dans EF. Cela sonne comme une réponse merdique à mon problème si j'aimerais entendre quelqu'un savoir ce que l'affaire est. Buehler?

Mise à jour: fixed! Aller hors du concept de partitionnement horizontal dans l'un des articles que je trouvais sur msdn (http://msdn.microsoft.com/en-us/library/cc716779.aspx)I est allé et a ajouté manuellement les conditions du MSL. Il semble que vous ne pouvez pas avoir ce travail automatiquement du concepteur. Pour ceux qui se demandent, ouvrez le edmx dans le xml et editer aller vers le bas et regarder les éléments des conditions de vos correspondances. Ajouter dans des conditions supplémentaires en cas de besoin (apparemment les conditions ne sont pas hériter d'entités mères, donc vous devez les ajouter manuellement aux enfants) et compilent!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top