Обзор 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>