int PK、1つのNOT NULLフィールド、および2つのNULL文字列フィールドを持つテーブルがあります。
EFでTPHスタイルのデザインを設定するときは、次のように設定します。
トップレベルタイプには、PKフィールドとNOTNULLフィールドのみがあります。
最初のレベルは、最初のnull許容フィールドをディスクリミネーターとしてチェックします。nullではない結果の型は抽象です。それに応じてフィールドをマッピングします。
2番目のフィールドに対してこれを再度実行し、nullでない場所に再度マッピングします。マップするフィールドにnullable=falseを設定しました。
<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>
「異なるキーを持つ2つのエンティティが同じ行にマップされています」というメッセージが表示されます。
最初のアイテムのnullではない属性が子に継承されていないためだと思います。
NullField1がnullでNullField2がnullでない場合に対処するために3番目のタイプを作成しました(これは私のDBでは発生しません、制約があります)が、追加しても機能しません。
2つのサブ子のいずれかにnull以外の条件を明示的に追加するには、列をマップする必要があります。これは、外部のプロパティにマップしても機能しません。
「BothNullItem」の条件の組み合わせも機能しません。
何か案は?