Как определить модель с помощью хранимой процедуры (платформа Entity Framework)
Хранимая процедура, которая определена в базе данных, может быть представлена в концептуальной модели двумя способами.
В концептуальной модели можно создать импорт функции, который соответствует хранимой процедуре. Это позволяет создать в ObjectContext метод, который выполняет в базе данных хранимую процедуру. В зависимости от того, как определена хранимая процедура, соответствующий импорт функции может вернуть типы сущности или сложные типы.
Операции вставки, обновления и удаления для типа сущности могут быть сопоставлены с хранимыми процедурами. Это позволяет определить специализированное поведение операций вставки, обновления и удаления для типов сущности.
Примечание Если не выполнено сопоставление с хранимыми процедурами всех трех операций типа сущности (вставки, обновления и удаления), то несопоставленные операции во время выполнения будут оканчиваться неудачей и вызывать исключение UpdateException.
В данном разделе рассматривается создание импорта функции в концептуальной модели, которая сопоставлена с хранимой процедурой в базе данных. Дополнительные сведения о сопоставлении операций вставки, обновления и удаления типов сущности с хранимыми процедурами см. в разделе Как определить модель с хранимыми процедурами модификации (платформа Entity Framework).
Для создания импорта функции, которая сопоставлена с хранимой процедурой, рекомендуется использовать ADO.NET Entity Data Model Tools. Сведения по использованию средств модели EDM см. в следующих разделах:
Для создания импорта функции, которая сопоставлена с хранимой процедурой, можно вручную изменить файлы сопоставления и модель. Пример в этом разделе показывает, как это можно сделать. Пример основан на образце базы данных School и модели School. Дополнительные сведения о создании модели School по базе данных School см. в разделе Генератор модели EDM (EdmGen.exe). Предположим, что в базе данных определена хранимая процедура. Чтобы создать импорт функции, которая сопоставлена с хранимой процедурой, необходимо выполнить следующие шаги.
Добавьте в модель хранения элемент Function, который указывает хранимую процедуру в базе данных.
Добавьте в концептуальную модель элемент FunctionImport, который указывает импорт функции в концептуальной модели.
Добавьте в файл сопоставления элемент 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 в модель хранения
Откройте модель хранения (SSDL-файл).
Добавьте следующий элемент 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
Откройте концептуальную модель (CSDL-файл).
Добавьте следующий элемент FunctionImport в качестве дочернего элемента для элемента EntityContainer.
<FunctionImport Name="GetStudentGrades" EntitySet="StudentGrades" ReturnType="Collection(SchoolModel.StudentGrade)"> <Parameter Name="StudentID" Mode="In" Type="Int32" /> </FunctionImport>
Добавление элемента FunctionImportMapping в файл сопоставления
Откройте файл сопоставления (MSL-файл).
Добавьте следующий элемент FunctionImportMapping в качестве дочернего элемента для элемента EntityContainerMapping:
<FunctionImportMapping FunctionImportName="GetStudentGrades" FunctionName="SchoolModel.Store.GetStudentGrades" />
См. также
Другие ресурсы
Определение расширенных моделей данных (задачи платформы Entity Framework)
How to: Define Custom Functions in the Storage Model
Спецификации языка CSDL, SSDL и MSL