Как добавлять определяющий запрос (платформа Entity Framework)
В этом разделе описан процесс добавления определяющего запроса и соответствующего концептуального типа сущности в EDMX-файл. Определяющий запрос позволяет выполнить инструкцию SQL, указанную в элементе DefiningQuery EDMX-файла. Дополнительные сведения см. в разделе DefiningQuery Element (EntitiContainer SSDL). Определяющие запросы часто применяются для реализации функциональности, аналогичной той, которую обеспечивают представления базы данных, хотя определяются в EDMX-файле, а не в базе данных. Концептуальный тип сущности используется для отображения данных с помощью определения запроса на концептуальном уровне.
Примечание |
---|
Любые изменения модели хранения, включая определение запросов, будут перезаписаны при запуске мастера обновления моделей. |
Параметризованные запросы не могут выполняться как определяющие запросы. По умолчанию данные, отображенные с помощью определяющего запроса, доступны только для чтения. Однако их обновление возможно через сопоставление функций вставки, обновления и удаления типа сущности, который отображает данные в хранимых процедурах. Дополнительные сведения см. в разделах Как сопоставить функции изменения с хранимыми процедурами (средства работы с моделью EDM) и Пошаговое руководство по сопоставлению сущностей с хранимыми процедурами (средства модели EDM).
Следующие процедуры обеспечивают высокоуровневую структуру добавления определяющего запроса и концептуального типа сущности в EDMX-файл. Приведенный ниже пример подробно описывает этапы данных процедур.
Следующие процедуры предполагают наличие EDMX-файла, открытого в редакторе XML в Visual Studio.
Добавление определяющего запроса
Добавление определяющего запроса
Добавьте элемент EntitySet в раздел SSDL EDMX-файла. Укажите только атрибуты Name и EntityType для элемента EntitySet. Дополнительные сведения см. в разделе EntitySet Element (EntityContainer SSDL).
Добавьте элемент DefiningQuery во вновь добавленный элемент EntitySet. Укажите инструкцию SQL для выполнения в теле элемента DefiningQuery. Дополнительные сведения см. в разделе DefiningQuery Element (EntitiContainer SSDL).
Добавьте элемент EntityType в раздел SSDL EDMX-файла. Этот элемент EntityType должен описывать столбцы, возвращаемые инструкцией SQL в элементе DefiningQuery. Дополнительные сведения см. в разделе EntityType Element (SSDL).
Добавление типа сущности в концептуальную модель
Добавление концептуального типа сущности
Добавьте элемент EntitySet в раздел CSDL EDMX-файла. Дополнительные сведения см. в разделе EntitySet Element (EntityContainer CSDL).
Добавьте элемент EntityType в раздел CSDL EDMX-файла. Атрибут Name должен иметь то же значение, что и атрибут Name элемента EntitySet в предыдущем шаге. Свойства типа сущности должны сопоставляться данным, возвращаемым инструкцией SQL, указанной в элементе DefiningQuery вышеописанной процедуры. Дополнительные сведения см. в разделе EntityType Element (CSDL).
Сопоставление концептуального типа сущности и типа сущности хранилища.
Сопоставление концептуального типа сущности и типа сущности хранилища
- Добавьте элемент EntitySetMapping в раздел сопоставления EDMX-файла, в котором содержится сопоставление концептуальных сущностей и сущностей хранения в двух предыдущих процедурах. Дополнительные сведения см. в разделах EntitySetMapping Element (MSL) и Mapping a Conceptual Model to a Storage Schema.
Пример
Следующий пример демонстрирует процесс добавления определяющего запроса в файл School.edmx для отображения сведений об оценках учащихся с типом сущности GradeReport. Чтобы создать файл School.edmx, выполните шаги, приведенные в разделе Создание модели EDM «School» Entity Framework Quickstart.
Чтобы добавить определяющий запрос, необходимо сначала добавить следующий элемент EntitySet (содержащий элемент DefiningQuery) в раздел SSDL EDMX-файла. Обратите внимание на следующие моменты.
Указаны только атрибуты Name и EntityType элемента EntitySet.
Полное имя типа сущности используется в атрибуте EntityType.
Инструкция SQL для выполнения указана в элементе DefiningQuery.
<EntitySet Name="GradeReport"
EntityType="SchoolModel.Store.GradeReport" >
<DefiningQuery>
SELECT CourseID, Grade, FirstName, LastName
FROM StudentGrade
JOIN
(SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
ON StudentID = p.PersonID
</DefiningQuery>
</EntitySet>
Далее добавьте следующий элемент EntityType в раздел SSDL EDMX. -файла. Обратите внимание на следующие моменты.
Значение атрибута Name соответствует значению атрибута EntityType в вышеописанном элементе EntitySet, несмотря на то что полное имя типа сущности используется в атрибуте EntityType.
Имена свойств соответствуют именам столбцов, возвращаемых инструкцией SQL в элементе DefiningQuery (см. выше).
В данном примере ключ сущности состоит из трех свойств, что обеспечивает уникальность значения ключа.
<EntityType Name="GradeReport">
<Key>
<PropertyRef Name="CourseID" />
<PropertyRef Name="FirstName" />
<PropertyRef Name="LastName" />
</Key>
<Property Name="CourseID"
Type="int"
Nullable="false" />
<Property Name="Grade"
Type="decimal"
Precision="3"
Scale="2" />
<Property Name="FirstName"
Type="nvarchar"
Nullable="false"
MaxLength="50" />
<Property Name="LastName"
Type="nvarchar"
Nullable="false"
MaxLength="50" />
</EntityType>
Чтобы добавить тип сущности в концептуальную модель, необходимо сначала добавить следующий элемент EntitySet в раздел CSDL EDMX-файла. Заметьте, что полное имя типа сущности используется в атрибуте EntityType.
<EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />
Далее добавьте следующий элемент EntityType в CSDL раздел EDMX-файла. Обратите внимание на следующие моменты.
Значение атрибута Name соответствует значению атрибута EntityType в вышеописанном элементе EntitySet, несмотря на то что полное имя типа сущности используется в атрибуте EntityType.
Имена свойств соответствуют именам столбцов, возвращаемых инструкцией SQL в элементе DefiningQuery (см. выше).
В данном примере ключ сущности состоит из трех свойств, что обеспечивает уникальность значения ключа.
<EntityType Name="GradeReport">
<Key>
<PropertyRef Name="CourseID" />
<PropertyRef Name="FirstName" />
<PropertyRef Name="LastName" />
</Key>
<Property Name="CourseID"
Type="Int32"
Nullable="false" />
<Property Name="Grade"
Type="Decimal"
Precision="3"
Scale="2" />
<Property Name="FirstName"
Type="String"
Nullable="false"
MaxLength="50"
Unicode="true"
FixedLength="false" />
<Property Name="LastName"
Type="String"
Nullable="false"
MaxLength="50"
Unicode="true"
FixedLength="false" />
</EntityType>
Чтобы сопоставить концептуальный тип сущности с сущностью хранилища, необходимо добавить следующий элемент EntitySetMapping в раздел сопоставления EDMX-файла.
<EntitySetMapping Name="GradeReport">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
<MappingFragment StoreEntitySet="GradeReport">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
<ScalarProperty Name="Grade" ColumnName="Grade" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
Тип сущности GradeReport будет добавлен в модель School. Обратите внимание, что данные, отображаемые через тип сущности GradeReport, доступны только для чтения.
См. также
Основные понятия
Общие сведения об EDMX-файле (платформа Entity Framework)