У меня есть таблица с int PK, одним полем NOT NULL и двумя строковыми полями NULL.
Когда я иду и настраиваю дизайн в стиле TPH в EF, я настраиваю его так:
Тип верхнего уровня имеет только PK и поле NOT 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>
Я получаю "две сущности с разными ключами отображаются в одной строке".
Я думаю, это потому, что, возможно, атрибут not null первого элемента не наследуется детьми.
Я создал третий тип, чтобы попытаться позаботиться о том, чтобы NullField1 был нулевым, а NullField2 не нулевым (что не произойдет в моей БД, у меня есть ограничение), но даже если я его добавлю, это не не работает.
Явное добавление ненулевого условия для любого из 2 дочерних элементов требует от меня отображения столбца, который все равно не работает, даже если я сопоставляю его с каким-то посторонним свойством.
Ни одна из комбинаций условий для "BothNullItem" также не работает.
Есть идеи?