Таблица за проблемы с макетом иерархии в EF 4.1 с множеством нулевых дискриминаторов
Вопрос
У меня есть таблица с INT PK, одним не нулевым полем и двумя нулевыми струнными полями.
Когда я иду и создаю дизайн в стиле TPH в EF, я установил его таким образом:
Тип верхнего уровня имеет только PK, а не нулевое поле.
Первый уровень проверяет первое нулевое поле как дискриминатор. Не нулевой, полученный тип, абстрактный. Я сопоставляю поле соответственно.
Я делаю это снова для второго поля, снова карты, где не нулевой. Я установил nullable = false на полях I Карта.
<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>
Я получаю «две сущности с разными ключами, нанесенные на карту в одном и том же ряду».
Я думаю, что это потому, что, возможно, первый атрибут «Не нулевой» не унаследован детьми.
Я создал третий тип, чтобы попытаться позаботиться о том, чтобы Nullfield1 был Null, а Nullfield2 не является нулевым (что не произойдет в моем DB, у меня есть ограничение), но даже если я добавил его. Анкет
Явное добавление не нулевого условия ни на одну из 2 детей, чтобы я отобразил столбец, который по -прежнему не работает, даже если я сопоставляю его с каким -то посторонним свойством.
Ни одна из комбинаций условий для «bothnullitem» также не работает.
Любые идеи?
Решение
Welp, я закончил тем, что отказался от попытки заставить колонки дискриминатора распространять наследство, поэтому я создал 3 просмотра, один верхний уровень, один для нулевого поля1, а не Null Field One, а затем на не нулевом поле, я делаю поле 2 дискриминатором колонка в EF. Это звучит как дерьмовый ответ на мою проблему, поэтому я хотел бы услышать от кого -то, кто знает, в чем дело. Бюлер?
Обновление: исправлено! Выходя из концепции горизонтального разделения в одной из статей, которые я нашел на MSDN (http://msdn.microsoft.com/en-us/library/cc716779.aspx)i и вручную добавил условия в MSL. Похоже, вы не можете выполнять эту работу автоматически от дизайнера. Для тех из вас, кто задается вопросом, откройте EDMX в редактировании XML, идите и посмотрите на элементы условий ваших отображений. Добавьте дополнительные условия, где это необходимо (по -видимому, условия не наследуют от родительских сущностей, поэтому вы должны вручную добавить их к детям) и компилировать!