Проблемы макета таблицы на иерархию в 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, посмотрите вниз и посмотрите на условия условий ваших отображений. При необходимости добавьте дополнительные условия (очевидно, что условия не наследуются от родительских объектов, поэтому вы должны вручную добавить их к дочерним элементам) и скомпилируйте!

Другие вопросы по тегам