Проблемы макета таблицы на иерархию в EF 4.1 с множественными различимыми признаками - PullRequest
0 голосов
/ 10 июня 2011

У меня есть таблица с 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 Ответ

0 голосов
/ 11 июня 2011

Welp, я закончил тем, что разочаровался в попытке заставить столбцы дискриминатора распространяться через наследование, поэтому я создал 3 представления, один верхний уровень, один для нулевого поля 1 и не нулевое поле один, а затем на не нулевом поле один, я делаю field2 столбец дискриминатора в EF. Это звучит как дерьмовый ответ на мою проблему, поэтому я хотел бы услышать от кого-то, кто знает, что это за сделка. Бюлер

ОБНОВЛЕНИЕ: ИСПРАВЛЕНО! Отход от концепции горизонтального разбиения в одной из статей, которые я нашел на MSDN (http://msdn.microsoft.com/en-us/library/cc716779.aspx)I, вошел и вручную добавил условия в MSL. Похоже, вы не можете получить эту работу автоматически от дизайнера. Для тех из вас, Интересно, откройте edmx в редакторе xml и посмотрите вниз на элементы условий ваших сопоставлений. Добавьте дополнительные условия, где это необходимо (очевидно, условия не наследуются от родительских сущностей, поэтому вы должны вручную добавить их к дочерним элементам) и компилировать!

...