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


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

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

Во многих приложениях с использованием баз данных хранимые процедуры обеспечивают следующие преимущества.

  • Безопасность. Пользователям баз данных может быть запрещен прямой доступ к таблицам и другим объектам базы данных. Администраторы баз данных могут ограничиться лишь предоставлением разрешений на выполнение хранимых процедур, чтобы создать единичные точки входа для доступа к данным. Это существенно уменьшает контактную зону для атак путем внедрения кода SQL. Входные и выходные параметры, настроенные на использование значений по умолчанию, дают возможность проводить строгую проверку параметров. Код проверки в хранимых процедурах может ограничивать допустимые действия.

  • Инкапсуляция. Сложную логику данных, явные транзакции и другие операции базы данных можно написать один раз в виде кода хранимых процедур и вызывать на выполнение во многих клиентских приложениях. Ошибки, исключения и нарушения параллелизма можно обрабатывать из кода сервера, что уменьшает число обменов данными с клиентским приложением. Код хранимых процедур можно изменять, не оказывая влияния на клиентские приложения, при условии, что подпись хранимой процедуры остается неизменной.

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

  • Производительность. В некоторых ситуациях хранимые процедуры могут способствовать повышению производительности. Современные компоненты Database Engine обычно обрабатывают динамические инструкции SQL так же эффективно, как и инструкции в хранимых процедурах; стимулируя применение хранимых процедур, администраторы баз данных приобретают больший контроль над производительностью.

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

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

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

По умолчанию на платформе Entity Framework операции выполняются непосредственно в таблицах баз данных на основе сопоставлений между концептуальной схемой и схемой хранения. Настройка платформы Entity Framework в целях применения хранимых процедур для обновления данных требует внесения изменений в схему хранения и концептуальную схему.

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

Операция Требования языка SSDL Требования языка MSL Требования языка CSDL

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

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

Добавить элемент FunctionImportMapping в элемент EntityContainerMapping в файле концептуальной модели.

Добавить элемент FunctionImport в элемент EntityContainer в файле концептуальной модели.

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

Добавить элементы Function внутрь элемента Schema в файле модели хранения. Выполните это действие однократно для каждой хранимой процедуры вставки, обновления и удаления.

Добавить элемент ModificationFunctionMapping в элемент EntityTypeMapping для данного типа сущности. Этот элемент должен определить элементы InsertFunction, UpdateFunction и DeleteFunction для хранимых процедур вставки, обновления и удаления. Если у сущности имеются связи, элемент AssociationEnd указывает ассоциацию.

Нет.

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

Добавить элементы Function внутрь элемента Schema в файле модели хранения. Выполните это действие однократно для каждой хранимой процедуры, которая создает или удаляет связи в источнике данных.

Добавить элемент ModificationFunctionMapping в элемент AssociationSetMapping Element для данной ассоциации. Этот элемент должен определить элементы InsertFunction и DeleteFunction для хранимых процедур, которые создают и удаляют связи для этой ассоциации.

Нет.

Хранимые процедуры и изменение данных

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

Язык CSDL

Следующий сегмент на языке CSDL определяет сущности SalesOrderHeader и SalesOrderDetail. Оба типа основаны на образце базы данных AdventureWorks, который поставляется с SQL Server 2005 и SQL Server 2008. Чтобы иметь возможность использовать хранимые процедуры для изменения данных модели EDM, не требуется вносить никаких изменений в код CSDL применяемой CSDL-схемы, однако для полноты эта схема приведена здесь. Для краткости в этой схеме опущены некоторые определения свойств. Полностью эту схему можно найти в образце в Модель AdventureWorks Sales (модель EDM).

      <Schema Namespace="AdventureWorksModel" 
              Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
        <EntityContainer Name="AdventureWorksEntities">
          <EntitySet Name="AddressType" EntityType="AdventureWorksModel.AddressType" />
          <EntitySet Name="Contact" EntityType="AdventureWorksModel.Contact" />
          <EntitySet Name="Product" EntityType="AdventureWorksModel.Product" />
          <EntitySet Name="SalesOrderDetail" 
                     EntityType="AdventureWorksModel.SalesOrderDetail" />
          <EntitySet Name="SalesOrderHeader" 
                     EntityType="AdventureWorksModel.SalesOrderHeader" />
          <AssociationSet Name="FK_SalesOrderHeader_Contact_ContactID"
Association="AdventureWorksModel.FK_SalesOrderHeader_Contact_ContactID">
            <End Role="Contact" EntitySet="Contact" />
            <End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
          </AssociationSet>
          <AssociationSet Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID" 
Association="AdventureWorksModel.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
            <End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
            <End Role="SalesOrderDetail" EntitySet="SalesOrderDetail" />
          </AssociationSet>

        </EntityContainer>

        
        <EntityType Name="SalesOrderDetail">
          <Key>
            <PropertyRef Name="SalesOrderID" />
            <PropertyRef Name="SalesOrderDetailID" />
          </Key>
          <Property Name="SalesOrderID" Type="Int32" Nullable="false" />
          <Property Name="SalesOrderDetailID"
                             Type="Int32" Nullable="false" />
          <Property Name="CarrierTrackingNumber" Type="String" />
          <Property Name="OrderQty" Type="Int16" Nullable="false" />
          <Property Name="ProductID" Type="Int32" Nullable="false" />
          <Property Name="SpecialOfferID" Type="Int32" Nullable="false" />
          <Property Name="UnitPrice" Type="Decimal" Nullable="false" />
          <Property Name="UnitPriceDiscount"
                             Type="Decimal" Nullable="false" />
          <Property Name="LineTotal" Type="Decimal" Nullable="false" />
          <Property Name="rowguid" Type="Guid" Nullable="false" />
          <Property Name="ModifiedDate"
                             Type="DateTime" Nullable="false" />
          <NavigationProperty Name="SalesOrderHeader"
Relationship="AdventureWorksModel.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID"
             FromRole="SalesOrderDetail" ToRole="SalesOrderHeader" />
        </EntityType>

        <EntityType Name="SalesOrderHeader">
          <Key>
            <PropertyRef Name="SalesOrderID" />
          </Key>
          <Property Name="SalesOrderID" Type="Int32" Nullable="false" />
          <Property Name="RevisionNumber" Type="Byte" Nullable="false" />
          <Property Name="OrderDate" Type="DateTime" Nullable="false" />
          <Property Name="DueDate" Type="DateTime" Nullable="false" />
          <Property Name="ShipDate" Type="DateTime" />
          <Property Name="Status" Type="Byte" Nullable="false" />
          <Property Name="OnlineOrderFlag"
                        Type="Boolean" Nullable="false" />
          <Property Name="SalesOrderNumber"
                        Type="String" Nullable="false" />
          <Property Name="PurchaseOrderNumber" Type="String" />
          <Property Name="AccountNumber" Type="String" />
          <Property Name="CustomerID" Type="Int32" Nullable="false" />
          <Property Name="SalesPersonID" Type="Int32" />
          <Property Name="TerritoryID" Type="Int32" />
          <Property Name="BillToAddressID"
                        Type="Int32" Nullable="false" />
          <Property Name="ShipToAddressID"
                        Type="Int32" Nullable="false" />
          <Property Name="ShipMethodID" Type="Int32" Nullable="false" />
          <Property Name="CreditCardID" Type="Int32" />
          <Property Name="CreditCardApprovalCode" Type="String" />
          <Property Name="CurrencyRateID" Type="Int32" />
          <Property Name="SubTotal" Type="Decimal" Nullable="false" />
          <Property Name="TaxAmt" Type="Decimal" Nullable="false" />
          <Property Name="Freight" Type="Decimal" Nullable="false" />
          <Property Name="TotalDue" Type="Decimal" Nullable="false" />
          <Property Name="Comment" Type="String" />
          <Property Name="rowguid" Type="Guid" Nullable="false" />
          <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
          <NavigationProperty Name="Contact" 
Relationship="AdventureWorksModel.FK_SalesOrderHeader_Contact_ContactID"
            FromRole="SalesOrderHeader" ToRole="Contact" />
          <NavigationProperty Name="SalesOrderDetail"
Relationship="AdventureWorksModel.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID"
            FromRole="SalesOrderHeader" ToRole="SalesOrderDetail" />
        </EntityType>

        <EntityType Name="AddressType">
          <Key>
            <PropertyRef Name="AddressTypeID" />
          </Key>
          <!-- Other properties -->
        </EntityType>

        <EntityType Name="Contact">
          <Key>
            <PropertyRef Name="ContactID" />
          </Key>
          <!-- Other properties -->
          <NavigationProperty Name="SalesOrderHeader"
Relationship="AdventureWorksModel.FK_SalesOrderHeader_Contact_ContactID" 
            FromRole="Contact" ToRole="SalesOrderHeader" />
        </EntityType>

        <EntityType Name="Product">
          <Key>
            <PropertyRef Name="ProductID" />
          </Key>
          <!-- Other properties -->
        </EntityType>


        <Association Name="FK_SalesOrderHeader_Contact_ContactID">
          <End Role="Contact" 
              Type="AdventureWorksModel.Contact" Multiplicity="1" />
          <End Role="SalesOrderHeader"
        Type="AdventureWorksModel.SalesOrderHeader" Multiplicity="*" />
        </Association>

        <Association Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
          <End Role="SalesOrderHeader"
          Type="AdventureWorksModel.SalesOrderHeader" Multiplicity="1">
            <OnDelete Action="Cascade" />
          </End>
          <End Role="SalesOrderDetail"
           Type="AdventureWorksModel.SalesOrderDetail" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="SalesOrderHeader">
              <PropertyRef Name="SalesOrderID" />
            </Principal>
            <Dependent Role="SalesOrderDetail">
              <PropertyRef Name="SalesOrderID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
      </Schema>

Дополнительные сведения о CSDL-схеме см. в разделе Концептуальная схема (язык CSDL).

Используемые в примере хранимые процедуры

В целях демонстрации применения хранимых процедур ниже приведены сценарии баз данных для изменения базы данных AdventureWorks. Эти сценарии создают хранимые процедуры для создания, обновления и удаления экземпляров SalesOrderDetail в хранилище.

NoteПримечание.

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

Процедура CreateSalesOrderDetail

Следующий сценарий создает хранимую процедуру, которая добавляет элементы SalesOrderDetail в хранилище. Этот сценарий содержит код, который можно использовать для удаления хранимой процедуры, если она больше не потребуется после опробования этого примера. Чтобы удалить эту хранимую процедуру, исключите строки после drop procedure и запустите сценарий.

USE [AdventureWorks]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID ( 'dbo.CreateSalesOrderDetail', 'P' ) IS NOT NULL 
DROP PROCEDURE dbo.CreateSalesOrderDetail;
GO

CREATE PROCEDURE [dbo].[CreateSalesOrderDetail] 
   @SalesOrderID int,
   @CarrierTrackingNumber nvarchar(25),
   @OrderQty smallint,
   @ProductID int,
   @SpecialOfferID int,
   @UnitPrice money,
   @UnitPriceDiscount money,
   @rowguid uniqueidentifier,
   @ModifiedDate datetime
   
AS

INSERT INTO [AdventureWorks].[Sales].[SalesOrderDetail]
           ([SalesOrderID]
           ,[CarrierTrackingNumber]
           ,[OrderQty]
           ,[ProductID]
           ,[SpecialOfferID]
           ,[UnitPrice]
           ,[UnitPriceDiscount]
           ,[rowguid]
           ,[ModifiedDate])
     VALUES
           (@SalesOrderID,
           @CarrierTrackingNumber,
           @OrderQty,
           @ProductID,
           @SpecialOfferID,
           @UnitPrice,
           @UnitPriceDiscount,
           @rowguid,
           @ModifiedDate)

select SalesOrderDetailID, LineTotal
 from [AdventureWorks].[Sales].[SalesOrderDetail]
 where SalesOrderID = @SalesOrderID and SalesOrderDetailID = scope_identity()

Процедура UpdateSalesOrderDetail

Следующий сценарий создает хранимую процедуру, используемую для обновления элементов SalesOrderDetail в хранилище.

USE [AdventureWorks]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID ( 'dbo.UpdateSalesOrderDetail', 'P' ) IS NOT NULL 
DROP PROCEDURE dbo.UpdateSalesOrderDetail;
GO

CREATE PROCEDURE [dbo].[UpdateSalesOrderDetail]
   @OrderQty smallint, 
   @SalesOrderDetailID int,
   @SalesOrderID int

AS
UPDATE [AdventureWorks].[Sales].[SalesOrderDetail]
   SET [OrderQty] = @OrderQty
 WHERE SalesOrderDetailID = @SalesOrderDetailID

Процедура DeleteSalesOrderDetail

Следующий сценарий создает хранимую процедуру, используемую для удаления элементов SalesOrderDetail в хранилище.

USE [AdventureWorks]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID ( 'dbo.DeleteSalesOrderDetail', 'P' ) IS NOT NULL 
DROP PROCEDURE dbo.DeleteSalesOrderDetail;
GO

CREATE PROCEDURE [dbo].[DeleteSalesOrderDetail] 
   @SalesOrderDetailID int,
   @SalesOrderID int 
AS
DELETE FROM [AdventureWorks].[Sales].[SalesOrderDetail]
      WHERE SalesOrderDetailID = @SalesOrderDetailID

Язык SSDL

В этой схеме хранения элементы Function определяют хранимые процедуры, которые доступны в базе данных. Вложенные элементы Parameter указывают имена параметров хранимых процедур, которые можно сопоставлять. Эти декларации сообщают платформе Entity Framework, что хранимые процедуры существуют в базе данных, но не указывают сопоставление. Сопоставление должно быть реализовано в схеме сопоставления, как показано ниже в этом разделе.

Для атрибута IsComposable декларации функции, представляющей хранимую процедуру, необходимо задать значение false. Это показывает, что результаты, возвращаемые процедурой, нельзя использовать в предложении FROM других инструкций Entity SQL. Следующие декларации в схеме хранения указывают три хранимые процедуры: CreateSalesOrderDetail, UpdateSalesOrderDetail и DeleteSalesOrderDetail.

        <Function Name="CreateSalesOrderDetail" Aggregate="false"
                  BuiltIn="false" NiladicFunction="false"
                  IsComposable="false"
                  ParameterTypeSemantics="AllowImplicitConversion"
                  Schema="dbo">
          <Parameter Name="SalesOrderID" Type="int" Mode="In" />
          <Parameter Name="CarrierTrackingNumber" Type="nvarchar" Mode="In" />
          <Parameter Name="OrderQty" Type="smallint" Mode="In" />
          <Parameter Name="ProductID" Type="int" Mode="In" />
          <Parameter Name="SpecialOfferID" Type="int" Mode="In" />
          <Parameter Name="UnitPrice" Type="money" Mode="In" />
          <Parameter Name="UnitPriceDiscount" Type="money" Mode="In" />
          <Parameter Name="rowguid" Type="uniqueidentifier" Mode="In" />
          <Parameter Name="ModifiedDate" Type="datetime" Mode="In" />
        </Function>

        <Function Name="UpdateSalesOrderDetail" Aggregate="false"
                  BuiltIn="false" NiladicFunction="false"
                  IsComposable="false"
                  ParameterTypeSemantics="AllowImplicitConversion"
                  Schema="dbo">
          <Parameter Name="OrderQty" Type="smallint" Mode="In"/>
          <Parameter Name="SalesOrderDetailID" Type="int" Mode="In"/>
          <Parameter Name="SalesOrderID" Type="int" Mode="In"/>
        </Function>

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

Полностью схему хранения модели продаж AdventureWorks Sales в том виде, как она существует до добавления хранимых процедур, см. в разделе Схема хранилища модели AdventureWorks Sales (модель EDM).

Язык MSL

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

Под элементом EntityTypeMapping для EntitySetMapping расположен элемент ModificationFunctionMapping, который описывает, какие функции, указанные в SSDL-файле, обеспечивают обработку изменений. Дочерние элементы включают DeleteFunction, InsertFunction и UpdateFunction. Каждое сопоставление функции указывает имя FunctionName для сопоставляемой хранимой процедуры.

Элемент AssociationEnd в EntityTypeMapping позволяет трактовать связь как ссылку или внешний ключ, который служит основой ассоциации, связывающей одну сущность с другой. Сведения о создании и удалении ассоциаций между существующими сущностями с помощью хранимых процедур см. в разделе Сопоставление набора ассоциаций с хранимыми процедурами (платформа Entity Framework).

  <ModificationFunctionMapping >
    <InsertFunction
       FunctionName="AdventureWorksModel.Store.CreateSalesOrderDetail">
        <ScalarProperty Name="CarrierTrackingNumber"
              ParameterName="CarrierTrackingNumber" Version="Current"/>
        <ScalarProperty Name="OrderQty" ParameterName="OrderQty"
              Version="Current"/>
        <ScalarProperty Name="ProductID" ParameterName="ProductID" Version="Current"/>
         <ScalarProperty Name="SpecialOfferID"
              ParameterName="SpecialOfferID" Version="Current"/>
        <ScalarProperty Name="UnitPrice" 
              ParameterName="UnitPrice" Version="Current"/>
        <ScalarProperty Name="UnitPriceDiscount"
              ParameterName="UnitPriceDiscount" Version="Current"/>
        <ScalarProperty Name="rowguid" ParameterName="rowguid"
              Version="Current"/>
        <ScalarProperty Name="ModifiedDate"
              ParameterName="ModifiedDate" Version="Current"/>
        <AssociationEnd
           AssociationSet="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID"
          From="SalesOrderDetail" To="SalesOrderHeader">
        <ScalarProperty Name="SalesOrderID"
                   ParameterName="SalesOrderID" />
        </AssociationEnd>
        <ResultBinding ColumnName="SalesOrderDetailID"
                   Name="SalesOrderDetailID" />
         <ResultBinding ColumnName="LineTotal" Name="LineTotal" />
  </InsertFunction>

    <UpdateFunction
    FunctionName="AdventureWorksModel.Store.UpdateSalesOrderDetail" >
        <ScalarProperty Name="OrderQty" ParameterName="OrderQty"
             Version="Current"/>
        <ScalarProperty Name="SalesOrderDetailID"
           ParameterName="SalesOrderDetailID" Version="Current"/>
        <AssociationEnd
    AssociationSet="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID"
       From="SalesOrderDetail" To="SalesOrderHeader">
          <ScalarProperty Name="SalesOrderID"
            ParameterName="SalesOrderID" Version="Current" />
        </AssociationEnd>
    </UpdateFunction>

    <DeleteFunction
     FunctionName="AdventureWorksModel.Store.DeleteSalesOrderDetail" >
        <ScalarProperty Name="SalesOrderDetailID"
           ParameterName="SalesOrderDetailID" Version="Original"/>
        <AssociationEnd
           AssociationSet="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID"
          From="SalesOrderDetail" To="SalesOrderHeader">
        <ScalarProperty Name="SalesOrderID"
                  ParameterName="SalesOrderID" />
        </AssociationEnd>
    </DeleteFunction>
  </ModificationFunctionMapping>

Чтобы изучить схему сопоставления для модели AdventureWorks, прежде чем добавлять хранимые процедуры, см. раздел Схема сопоставления модели AdventureWorks Sales (модель EDM).

Управление оптимистическим параллелизмом

Атрибут Version элемента ScalarProperty поддерживает использование управления оптимистическим параллелизмом для обновления и удаления. Можно задать атрибут Version, значение которого равно либо original (что было первоначально считано из базы данных), либо current (что могло быть изменено клиентским кодом). В сопоставлениях функций обновления необходимо указывать версии. Указывать версии для сопоставлений функций удаления не обязательно. Для вставок оптимистический параллелизм не требуется, поскольку отсутствуют исходные значения, которые нужно было бы проверять по источнику данных.

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

Входные параметры, привязанные к исходным версиям свойств сущности, используются в предложении WHERE инструкций UPDATE или DELETE в хранимой процедуре. Что касается обновлений, то дополнительные параметры, привязанные к текущим версиям свойств сущности, используются в предложении SET инструкции UPDATE в хранимой процедуре. Это обеспечивает проверку того, что новые, текущие значения будут присвоены в источнике данных только при том условии, что исходные значения все еще совпадают со значениями в источнике данных. Обновление или удаление окончится неудачей, если исходные значения были изменены в источнике данных другим пользователем или другим приложением после того, как были получены.

Получение значений с сервера

Для вставок и обновлений предназначен дополнительный дочерний элемент, ResultBinding, который поддерживает возврат значений, выработанных на сервере, с помощью результирующего набора. Элемент ResultBinding указывает, как устанавливается соответствие между возвращаемыми значениями и свойствами сущности, и обеспечивает для конвейера обновления возможность задавать значения в объектах на основе концептуальной модели.

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

    <ResultBinding Name="SalesOrderDetailID"
                    ColumnName="SalesOrderDetailID" />
    <ResultBinding Name="LineTotal" ColumnName="LineTotal" />
  </InsertFunction>

В коде хранимой процедуры используйте инструкцию SELECT после выполнения инструкции INSERT или UPDATE, чтобы получить значение, передаваемое в элемент ResultBinding.

SELECT SalesOrderDetailID, LineTotal
  FROM [AdventureWorks].[Sales].[SalesOrderDetail]
  WHERE SalesOrderID = @SalesOrderID and SalesOrderDetailID = scope_identity()

См. также

Задачи

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

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

ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)
Ресурсы платформы Entity Framework
Терминология платформы Entity Framework
Сопоставление набора ассоциаций с хранимыми процедурами (платформа Entity Framework)

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

Спецификации модели EDM
Спецификация схем и сопоставлений (платформа Entity Framework)
Пошаговое руководство: сопоставление сущности с хранимыми процедурами