Как добавлять определяющий запрос (платформа Entity Framework)

В этом разделе описан процесс добавления определяющего запроса и соответствующего концептуального типа сущности в EDMX-файл. Определяющий запрос позволяет выполнить инструкцию SQL, указанную в элементе DefiningQuery EDMX-файла. Дополнительные сведения см. в разделе DefiningQuery Element (EntitiContainer SSDL). Определяющие запросы часто применяются для реализации функциональности, аналогичной той, которую обеспечивают представления базы данных, хотя определяются в EDMX-файле, а не в базе данных. Концептуальный тип сущности используется для отображения данных с помощью определения запроса на концептуальном уровне.

Cc982038.note(ru-ru,VS.100).gifПримечание
Любые изменения модели хранения, включая определение запросов, будут перезаписаны при запуске мастера обновления моделей.

Параметризованные запросы не могут выполняться как определяющие запросы. По умолчанию данные, отображенные с помощью определяющего запроса, доступны только для чтения. Однако их обновление возможно через сопоставление функций вставки, обновления и удаления типа сущности, который отображает данные в хранимых процедурах. Дополнительные сведения см. в разделах Как сопоставить функции изменения с хранимыми процедурами (средства работы с моделью EDM) и Пошаговое руководство по сопоставлению сущностей с хранимыми процедурами (средства модели EDM).

Следующие процедуры обеспечивают высокоуровневую структуру добавления определяющего запроса и концептуального типа сущности в EDMX-файл. Приведенный ниже пример подробно описывает этапы данных процедур.

Следующие процедуры предполагают наличие EDMX-файла, открытого в редакторе XML в Visual Studio.

Добавление определяющего запроса

Добавление определяющего запроса

  1. Добавьте элемент EntitySet в раздел SSDL EDMX-файла. Укажите только атрибуты Name и EntityType для элемента EntitySet. Дополнительные сведения см. в разделе EntitySet Element (EntityContainer SSDL).

  2. Добавьте элемент DefiningQuery во вновь добавленный элемент EntitySet. Укажите инструкцию SQL для выполнения в теле элемента DefiningQuery. Дополнительные сведения см. в разделе DefiningQuery Element (EntitiContainer SSDL).

  3. Добавьте элемент EntityType в раздел SSDL EDMX-файла. Этот элемент EntityType должен описывать столбцы, возвращаемые инструкцией SQL в элементе DefiningQuery. Дополнительные сведения см. в разделе EntityType Element (SSDL).

Добавление типа сущности в концептуальную модель

Добавление концептуального типа сущности

  1. Добавьте элемент EntitySet в раздел CSDL EDMX-файла. Дополнительные сведения см. в разделе EntitySet Element (EntityContainer CSDL).

  2. Добавьте элемент EntityType в раздел CSDL EDMX-файла. Атрибут Name должен иметь то же значение, что и атрибут Name элемента EntitySet в предыдущем шаге. Свойства типа сущности должны сопоставляться данным, возвращаемым инструкцией SQL, указанной в элементе DefiningQuery вышеописанной процедуры. Дополнительные сведения см. в разделе EntityType Element (CSDL).

Сопоставление концептуального типа сущности и типа сущности хранилища.

Сопоставление концептуального типа сущности и типа сущности хранилища

  1. Добавьте элемент 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)

Другие ресурсы

Изменение EDMX-файла вручную (платформа Entity Framework)