Обзор ADO.NET Entity Framework - Сопоставление хранилищу

ОГЛАВЛЕНИЕ

Сопоставление хранилищу

Файл SSDL определяет структуру реляционных данных в базе данных. В нем также используются элементы XML EntityType и AssociationType, в этом случае для объявления структур таблиц и существующих в базе данных внешних ключей соответственно. Пространство имен файла SSDL основано на имени базы данных, использованной в EDM, тогда как элемент EntityContainer назван в соответствии со схемой базы данных. EntityContainer содержит наборы элементов EntitySet и AssociationSet, которые объявляют экземпляры таблиц и отношений, представленных элементами EntityType и AssociationType. Каждому набору EntitySet в файле SSDL соответствует таблица в базе данных.

Если вы создадите EDM на основе базы данных и немедленно откроете файлы CSDL и SSDL, не внося изменений, вы увидите, что они удивительно похожи. Это потому, что модели созданы прямо из базы данных, и концептуальная модель сопоставляется логическому хранилищу напрямую. Файл MSL содержит прямое соответствие CSDL и SSDL. Все запросы на основе такой EDM транслируются в созданные команды SQL. Entity Framework также поддерживает использование хранимых процедур вместо создания запросов SQL.

Для сопоставления модели (CSDL) хранилищу (SSDL) используется элемент EntityContainerMapping. Атрибут StorageEntityContainer показывает название контейнера EntityContainer в хранилище, а атрибут EdmEntityContainer показывает соответствующий EntityContainer в модели. Для сопоставления набора EntitySet модели набору EntitySet хранилища требуется элемент EntitySetMapping. Атрибут Name определяет название набора EntitySet модели, а атрибут TableName определяет название соответствующего набора EntitySet в хранилище. Каждое свойство модели сопоставляется хранилищу посредством элемента ScalarProperty. На Рис. 6 показан фрагмент файла MSL.

Figure 6 Сопоставление унаследованной сущности в MSL

<cs:EntitySetMapping cs:Name=”Products”>
  <cs:EntityTypeMapping cs:TypeName=”NorthwindModel.Products”>
  <cs:TableMappingFragment cs:TableName=”Products”>
  <cs:ScalarProperty cs:Name=”ProductID” cs:ColumnName=”ProductID” />
  <cs:ScalarProperty cs:Name=”ProductName” 
  cs:ColumnName=”ProductName” />
  <cs:ScalarProperty cs:Name=”QuantityPerUnit” 
  cs:ColumnName=”QuantityPerUnit” />
  <cs:ScalarProperty cs:Name=”UnitPrice” cs:ColumnName=”UnitPrice” />
  <cs:ScalarProperty cs:Name=”UnitsInStock” 
  cs:ColumnName=”UnitsInStock” />
  <cs:ScalarProperty cs:Name=”UnitsOnOrder” 
  cs:ColumnName=”UnitsOnOrder” />
  <cs:ScalarProperty cs:Name=”ReorderLevel” 
  cs:ColumnName=”ReorderLevel” />
  <!--<cs:ScalarProperty cs:Name=”Discontinued” 
  cs:ColumnName=”Discontinued” />-->
  <cs:Condition cs:ColumnName=”Discontinued” cs:Value=”0”/>
  </cs:TableMappingFragment>
  </cs:EntityTypeMapping>
<!--</cs:EntitySetMapping>
<cs:EntitySetMapping cs:Name=”DiscontinuedProducts”>-->
  <cs:EntityTypeMapping cs:TypeName=
  ”NorthwindModel.DiscontinuedProducts”>
  <cs:TableMappingFragment cs:TableName=”Products”>
  <cs:ScalarProperty cs:Name=”ProductID” cs:ColumnName=”ProductID” />
  <cs:ScalarProperty cs:Name=”ProductName” 
  cs:ColumnName=”ProductName” />
  <cs:ScalarProperty cs:Name=”QuantityPerUnit” 
  cs:ColumnName=”QuantityPerUnit” />
  <cs:ScalarProperty cs:Name=”UnitPrice” cs:ColumnName=”UnitPrice” />
  <cs:ScalarProperty cs:Name=”UnitsInStock” 
  cs:ColumnName=”UnitsInStock” />
  <cs:ScalarProperty cs:Name=”UnitsOnOrder” 
  cs:ColumnName=”UnitsOnOrder” />
  <cs:ScalarProperty cs:Name=”ReorderLevel” 
  cs:ColumnName=”ReorderLevel” />
  <cs:Condition cs:ColumnName=”Discontinued” cs:Value=”1”/>
  </cs:TableMappingFragment>
  </cs:EntityTypeMapping>
</cs:EntitySetMapping>