EF наследование / вопрос базового класса - PullRequest
0 голосов
/ 19 августа 2011

Я использую Entity Framework и службы RIA. У меня проблема с отображениями и наследованием. У меня есть (существующая) таблица с более чем 100 столбцами, назовите ее tblFacility, и я извлек ее в конструктор EF. Я хочу использовать как можно меньшую полосу пропускания, и в большинстве случаев мне нужны только два столбца: идентификатор и описание. Поэтому я добавил еще одну сущность, Facility, и сопоставил ее с tblFacility, а также сопоставил две колонки и установил идентификатор ключа. Затем я устанавливаю базовый класс сущности tblFacility в Facility.

Моя ошибка: Ошибка 3032: проблема с отображением фрагментов, начинающих строки .... Типы сущностей dbModel.tblFaclity, dbModel.Facility отображаются в те же строки в таблице tblMembers. Условия сопоставления можно использовать для различения строк, в которые отображаются эти типы.

В конструкторе есть Facility с двумя полями (одно ключ / ID, одно описание), а в tblFacility отсутствуют два только что упомянутых столбца, что выглядит правильно. Файл EDMX выглядит так, где я получаю сообщение об ошибке

<EntitySetMapping Name="Facilities">
        <EntityTypeMapping TypeName="IsTypeOf(dbModel.Facility)">
          <MappingFragment StoreEntitySet="tblFacility">
            <ScalarProperty Name="Number" ColumnName="intFaclNbr" />
            <ScalarProperty Name="Name" ColumnName="vcFaclName" />
          </MappingFragment>
        </EntityTypeMapping>
        <EntityTypeMapping xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs" TypeName="HSCAMasterModel.tblMember">
          <MappingFragment StoreEntitySet=" tblFacility">
            <ScalarProperty Name="Number" ColumnName="intFaclNbr" />                  <ScalarProperty Name="vcAddr1" ColumnName="vcAddr1" />
            <!--...over 100 more columns, name is not one of them...-->
       </MappingFragment>
        </EntityTypeMapping>
      </EntitySetMapping>

На данный момент мой клиент нуждается только в Facility и не нуждается в tblFacility, но доменная служба действительно нуждается в классе tblFacility. Я хотел использовать этот базовый класс Facility в качестве IQueryable. Имеет ли это какой-то смысл, или я не совсем согласен с тем, как мне следует использовать EF? Спасибо !!

1 Ответ

0 голосов
/ 20 августа 2011

Вы не можете использовать наследование для этого. Наследование имеет строгие правила. Одно из этих правил гласит, что каждая запись в базе данных может быть представлена ​​только одним типом сущности в вашей иерархии наследования. Таким образом, вы не можете использовать наследование, чтобы контролировать, сколько столбцов данной записи можно получить.

Вам нужна проекция. Вы можете либо попытаться определить проекцию непосредственно в EDMX, используя QueryView , либо вы можете проверить эту запись в блоге об использовании проекции с доменными службами.

...