Обзор ADO.NET Entity Framework - Сопоставление нескольким таблицам

ОГЛАВЛЕНИЕ

Сопоставление нескольким таблицам

Другим способом уйти в EDM от строгого взаимно-однозначного сопоставления модели хранилищу является сопоставление одной сущности в модели нескольким таблицам в хранилище. Между таблицами Contacts и ContactNameSplit в базе данных Northwind есть взаимно-однозначная связь, и можно объединить их в одну сущность в модели. Для примера я создам в модели сущность, включающую все поля таблицы Contacts и поля Title и Name из таблицы ContactNameSplit.

Первым изменением является добавление двух дополнительных свойств в элементе EntityType Contacts в файле CSDL: Name и Title.

Дальнейшие изменения более описательны. Эти два новых свойства в модели теперь должны быть сопоставлены хранилищу в файле MSL. Необходимо изменить элемент EntitySetMapping для EntitySet Contacts, чтобы представлять сопоставление нескольким таблицам. В этом примере я изменил существующий тег EntitySetMapping для EntitySet Contacts, удалив атрибуты TableName и TypeName. Эти атрибуты объявляются в элементе EntitySetMapping, только если набор EntitySet в модели взаимно-однозначно сопоставлен набору EntitySet в хранилище.

Поскольку сопоставление набора EntitySet модели набору EntitySet хранилища для Contacts было удалено, необходимо создать ему замену. Такой заменой является дочерний элемент EntityTypeMapping. Их необходимо создать два – по одному для представления каждой из таблиц Contacts и ContactNameSplit в хранилище. Элементы EntityTypeMapping определяют атрибут TypeName для каждого из наборов EntitySet.

Внутри каждого из элементов EntityTypeMapping помещен дочерний элемент, называющийся TableMappingFragment. Этот элемент включает атрибут TableName, соответствующий набору EntitySet в хранилище. В TableMappingFragment определены все элементы ScalarProperty, сопоставляющие свойства модели хранилищу. На Рис. 7 показан обновленный элемент EntitySetMapping Contacts, который теперь сопоставляет таблицы Contacts и ContactSplitName хранилища одному набору EntitySet модели.

Figure 7 Объединение таблиц в сущность

<cs:EntitySetMapping cs:Name=”Contacts”>
  <cs:EntityTypeMapping cs:TypeName=”NorthwindModel.Contacts”>
  <cs:TableMappingFragment cs:TableName=”Contacts”>
  <cs:ScalarProperty cs:Name=”ContactID” 
  cs:ColumnName=”ContactID” />
  <cs:ScalarProperty cs:Name=”ContactType” 
  cs:ColumnName=”ContactType” />
  <cs:ScalarProperty cs:Name=”CompanyName” 
  cs:ColumnName=”CompanyName” />
  <cs:ScalarProperty cs:Name=”ContactName” 
  cs:ColumnName=”ContactName” />
  <cs:ScalarProperty cs:Name=”ContactTitle” 
  cs:ColumnName=”ContactTitle” />
  <cs:ScalarProperty cs:Name=”Address” cs:ColumnName=”Address” />
  <cs:ScalarProperty cs:Name=”City” cs:ColumnName=”City” />
  <cs:ScalarProperty cs:Name=”Region” cs:ColumnName=”Region” />
  <cs:ScalarProperty cs:Name=”PostalCode” 
  cs:ColumnName=”PostalCode” />
  <cs:ScalarProperty cs:Name=”Country” cs:ColumnName=”Country” />
  <cs:ScalarProperty cs:Name=”Phone” cs:ColumnName=”Phone” />
  <cs:ScalarProperty cs:Name=”Extension” 
  cs:ColumnName=”Extension” />
  <cs:ScalarProperty cs:Name=”Fax” cs:ColumnName=”Fax” />
  <cs:ScalarProperty cs:Name=”PhotoPath” 
  cs:ColumnName=”PhotoPath” />
  </cs:TableMappingFragment>
  </cs:EntityTypeMapping>
  <cs:EntityTypeMapping cs:TypeName=”ContactNameSplit”>
  <cs:TableMappingFragment cs:TableName=”ContactNameSplit”>
  <cs:ScalarProperty cs:Name=”ContactID” cs:ColumnName=”ID” />
  <cs:ScalarProperty cs:Name=”Name” cs:ColumnName=”Name” />
  <cs:ScalarProperty cs:Name=”Title” cs:ColumnName=”Title” />
  </cs:TableMappingFragment>
  </cs:EntityTypeMapping>