Проблемы макета таблицы на иерархию в EF 4.1 с множественными различаемыми дискриминаторами
У меня есть таблица с 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" также не работает.
Есть идеи?
1 ответ
Хорошо, я закончил тем, что отказался от попыток заставить столбцы дискриминатора распространяться через наследование, поэтому я создал 3 представления, один верхний уровень, один для нулевого поля 1 и не нулевого поля один, а затем на непустом поле один, я делаю поле 2 дискриминатором колонка в EF. Это звучит как дерьмовый ответ на мою проблему, поэтому я хотел бы услышать от кого-то, кто знает, что это за сделка. Бюлер?
ОБНОВЛЕНИЕ: ИСПРАВЛЕНО! Отход от концепции горизонтального разбиения в одной из статей, которые я нашел на msdn (http://msdn.microsoft.com/en-us/library/cc716779.aspx), я вошел и вручную добавил условия в msl. Похоже, вы не можете получить эту работу автоматически от дизайнера. Для тех из вас, кто интересуется, откройте edmx в редакторе xml, посмотрите вниз и посмотрите на условия условий ваших отображений. При необходимости добавьте дополнительные условия (очевидно, что условия не наследуются от родительских объектов, поэтому вы должны вручную добавить их к дочерним элементам) и скомпилируйте!