Frage

Ich habe eine Tabelle mit einem int PK, einem Nullfeld und zwei Null -String -Feldern.

Wenn ich in EF ein Design im TPH-Stil einrichtete, habe ich es so eingerichtet:

Der Top Level -Typ hat nur das PK und das nicht Nullfeld.

Die erste Ebene überprüft das erste nullbare Feld als Diskriminator. Der nicht null resultierende Typ ist abstrakt. Ich karte das Feld entsprechend.

Ich mache das noch einmal für das zweite Feld und machte mich wieder auf, wo nicht null ist. Ich habe nullable = false auf den Feldern I festgelegt.

<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>

Ich bekomme "zwei Einheiten mit verschiedenen Schlüssel sind derselben Reihe zugeordnet".

Ich denke, es liegt daran, dass das Null -Attribut des ersten Gegenstands vielleicht nicht von den Kindern geerbt wird.

Ich habe einen dritten Typ erstellt, um zu versuchen, sich um den Fall zu kümmern .

Wenn ich explizit die Notnull -Bedingung zu einem der 2 Sub -Kinder hinzufügen kann, muss ich die Spalte abbilden, die immer noch nicht funktioniert, selbst wenn ich sie einer fremden Eigenschaft abbilden kann.

Keine der Kombinationen von Bedingungen für "Bothnullitem" funktioniert ebenfalls.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Welp, ich gab es auf, zu versuchen, Diskriminatorsäulen zu erhalten Spalte in EF. Das klingt nach einer beschissenen Antwort auf mein Problem, also würde ich gerne von jemandem hören, der weiß, was der Deal ist. Buehler?

Update: Behoben! In einem der Artikel, die ich auf MSDN gefunden habe (http://msdn.microsoft.com/en-us/library/cc7167999999999999999999999999.aspx), ging aus dem horizontalen Verteilungskonzept. Es sieht so aus, als ob Sie diese Arbeit nicht automatisch vom Designer haben können. Für diejenigen unter Ihnen, die sich wundern, öffnen Sie den EDMX im XML -Editer und gehen Sie hinunter und sehen Sie sich die Bedingungen der Elemente Ihrer Zuordnungen an. Fügen Sie bei Bedarf zusätzliche Bedingungen hinzu (anscheinend erben die Bedingungen nicht von übergeordneten Einheiten, sodass Sie sie den Kindern manuell hinzufügen müssen) und kompilieren Sie es!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top