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


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

Многие разработчики приложений и администраторы баз данных используют хранимые процедуры для обеспечения безопасности, предсказуемости и инкапсулирования логики работы с данными внутри базы данных. Пример в этом разделе содержит основные элементы синтаксиса схемы, необходимые, чтобы сопоставить хранимую процедуру с реализацией модели EDM. Затем хранимая процедура может быть вызвана в коде приложения, которое использует эту модель данных.

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

Примеры в этом разделе основаны на модели Adventure Works Sales. Чтобы запустить код данного примера, необходимо сначала добавить к проекту модель AdventureWorks Sales и настроить проект для использования платформы Entity Framework. Для этого выполните инструкции из разделов Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (платформа Entity Framework).

В модели AdventureWorks Sales определены пять сущностей:

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

Следующие сценарии и фрагменты схем базы данных используются для реализации хранимой процедуры, которая возвращает данные, содержащиеся в таблицах SalesOrderDetail, связанных с SalesOrderHeader. (Ассоциация FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID в модели продаж Sales Model может решить ту же задачу, что и этот пример.)

Создание хранимой процедуры в базе данных

  • Используйте среду SQL Server Management Studio или синтаксис команды запроса, чтобы выполнить следующую команду запроса, которая реализует хранимую процедуру в базе данных AdventureWorks.

    USE [AdventureWorks]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    IF OBJECT_ID ( 'dbo.GetOrderDetails', 'P' ) IS NOT NULL 
        DROP PROCEDURE dbo.GetOrderDetails;
    GO
    
    CREATE PROCEDURE [dbo].[GetOrderDetails] 
       @SalesOrderHeaderId int 
    AS
        SELECT SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber,
         OrderQty, ProductID, SpecialOfferID, UnitPrice, UnitPriceDiscount,
         rowguid, ModifiedDate, LineTotal
       FROM Sales.SalesOrderDetail
    WHERE SalesOrderID = @SalesOrderHeaderId;
    

Реализация требований языка SSDL

  1. Откройте SSDL-файл.

  2. Добавьте следующий синтаксис функции в теги схемы, но не в теги EntityContainer.

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

Реализация требований языка CSDL

  1. Откройте CSDL-файл.

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

    <FunctionImport Name="GetOrderDetails"
        EntitySet="SalesOrderDetail"
        ReturnType="Collection(AdventureWorksModel.SalesOrderDetail)">
      <Parameter Name="SalesOrderHeaderId" Type="Int32" Mode="In">
      </Parameter>
    </FunctionImport>
    

Реализация требований языка MSL

  1. Откройте файл.

  2. Добавьте следующий синтаксис EntityContainerMapping.

    <FunctionImportMapping FunctionImportName="GetOrderDetails"
      FunctionName="AdventureWorksModel.Store.GetOrderDetails"/>
    
  3. Перестройка модели.

См. также

Задачи

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

Основные понятия

Поддержка хранимых процедур (платформа Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)