Поделиться через


Как определить модель с помощью хранимой процедуры (платформа Entity Framework)

Хранимая процедура, которая определена в базе данных, может быть представлена в концептуальной модели двумя способами.

  • В концептуальной модели можно создать импорт функции, который соответствует хранимой процедуре. Это позволяет создать в ObjectContext метод, который выполняет в базе данных хранимую процедуру. В зависимости от того, как определена хранимая процедура, соответствующий импорт функции может вернуть типы сущности или сложные типы.

  • Операции вставки, обновления и удаления для типа сущности могут быть сопоставлены с хранимыми процедурами. Это позволяет определить специализированное поведение операций вставки, обновления и удаления для типов сущности.

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

В данном разделе рассматривается создание импорта функции в концептуальной модели, которая сопоставлена с хранимой процедурой в базе данных. Дополнительные сведения о сопоставлении операций вставки, обновления и удаления типов сущности с хранимыми процедурами см. в разделе Как определить модель с хранимыми процедурами модификации (платформа Entity Framework).

Для создания импорта функции, которая сопоставлена с хранимой процедурой, рекомендуется использовать ADO.NET Entity Data Model Tools. Сведения по использованию средств модели EDM см. в следующих разделах:

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

  1. Добавьте в модель хранения элемент Function, который указывает хранимую процедуру в базе данных.

  2. Добавьте в концептуальную модель элемент FunctionImport, который указывает импорт функции в концептуальной модели.

  3. Добавьте в файл сопоставления элемент FunctionImportMapping, который сопоставляет импорт функции в концептуальной модели и функцию в модели хранения.

Процедуры в данном разделе описывают создание элементов Function, FunctionImport и FunctionImportMapping для импорта следующих хранимых процедур в концептуальную модель:

IF NOT EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID(N'[dbo].[GetStudentGrades]') 
            AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'
CREATE PROCEDURE [dbo].[GetStudentGrades]
            @StudentID int
            AS
            SELECT EnrollmentID, Grade, CourseID, StudentID FROM dbo.StudentGrade
            WHERE StudentID = @StudentID
' 
END
GO

Добавление элемента Function в модель хранения

  1. Откройте модель хранения (SSDL-файл).

  2. Добавьте следующий элемент Function в качестве дочернего элемента для элемента Schema:

    <Function Name="GetStudentGrades" Aggregate="false" BuiltIn="false" 
              NiladicFunction="false" IsComposable="false" 
              ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
      <Parameter Name="StudentID" Type="int" Mode="In" />
    </Function>
    

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

  1. Откройте концептуальную модель (CSDL-файл).

  2. Добавьте следующий элемент FunctionImport в качестве дочернего элемента для элемента EntityContainer.

    <FunctionImport Name="GetStudentGrades" EntitySet="StudentGrades" 
                    ReturnType="Collection(SchoolModel.StudentGrade)">
      <Parameter Name="StudentID" Mode="In" Type="Int32" />
    </FunctionImport>
    

Добавление элемента FunctionImportMapping в файл сопоставления

  1. Откройте файл сопоставления (MSL-файл).

  2. Добавьте следующий элемент FunctionImportMapping в качестве дочернего элемента для элемента EntityContainerMapping:

    <FunctionImportMapping FunctionImportName="GetStudentGrades" 
                           FunctionName="SchoolModel.Store.GetStudentGrades" />
    

См. также

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

Определение расширенных моделей данных (задачи платформы Entity Framework)
How to: Define Custom Functions in the Storage Model
Спецификации языка CSDL, SSDL и MSL