#entity-framework #frameworks #entity #entity-framework-4.1 #table-per-hierarchy
#entity-framework #фреймворки #сущность #entity-framework-4.1 #таблица для каждой иерархии
Вопрос:
У меня есть таблица с значением int PK, одним полем NOT NULL и двумя полями NULL string.
Когда я иду и настраиваю дизайн в стиле TPH в EF, я настраиваю его следующим образом:
Тип верхнего уровня содержит только поле PK и поле NOT NULL.
Первый уровень проверяет первое обнуляемое поле как дискриминатор. Результирующий тип not null является абстрактным. Я соответствующим образом отображаю поле.
Я делаю это снова для второго поля, снова сопоставляя, где не 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 не равен нулю (чего не произойдет в моей базе данных, у меня есть ограничение), но даже если я добавлю его, это не сработает.
Явное добавление условия not null для любого из двух дочерних элементов требует, чтобы я сопоставил столбец, что все равно не работает, даже если я сопоставлю его с каким-либо посторонним свойством.
Ни одна из комбинаций условий для «BothNullItem» также не работает.
Есть идеи?
Ответ №1:
В итоге я отказался от попыток заставить столбцы дискриминатора распространяться через наследование, поэтому я создал 3 представления, одно верхнего уровня, одно для нулевого поля1 и ненулевого поля one, а затем для ненулевого поля one я делаю field2 столбцом дискриминатора в EF. Это звучит как дерьмовый ответ на мою проблему, поэтому я хотел бы услышать от кого-нибудь, кто в курсе, в чем дело. Бюлер?
ОБНОВЛЕНИЕ: ИСПРАВЛЕНО! Отказ от концепции горизонтального разделения в одной из статей, которые я нашел в msdn (http://msdn.microsoft.com/en-us/library/cc716779.aspx ) Я зашел и вручную добавил условия в msl. Похоже, что вы не можете выполнить эту работу автоматически из дизайнера. Для тех из вас, кому интересно, откройте edmx в редакторе xml и спуститесь вниз и посмотрите на элементы условий ваших сопоставлений. Добавьте дополнительные условия, где это необходимо (очевидно, условия не наследуются от родительских объектов, поэтому вам придется вручную добавлять их к дочерним) и скомпилируйте!