Share via


Unterstützung für gespeicherte Prozeduren (Entity Framework)

Das Entity Data Model (EDM) unterstützt die Verwendung von gespeicherten Prozeduren für Datenabruf und Datenänderung. Gespeicherte Prozeduren können zum Abrufen, Einfügen, Aktualisieren und Löschen von Daten verwendet werden.

Viele Datenbankanwendungen verwenden gespeicherte Prozeduren und bieten dadurch die folgenden Vorteile:

  • Sicherheit. Datenbankbenutzern kann der direkte Zugriff auf Tabellen oder andere Datenbankobjekte verweigert werden. Datenbankadministratoren müssen lediglich Ausführungsberechtigungen für gespeicherte Prozeduren erteilen, um einzelne Einstiegspunkte für den Datenzugriff zu erstellen. Dies verringert die Angriffsfläche für Angriffe durch Einschleusung von SQL-Befehlen wesentlich. Dadurch, dass Eingabe- und Ausgabeparameter für die Verwendung von Standardwerten konfiguriert werden, kann eine strenge Parameterüberprüfung durchgeführt werden. Durch Code zur Überprüfung in gespeicherten Prozeduren können die verfügbaren Aktionen eingeschränkt werden.

  • Kapselung. Komplexe Datenlogik, explizite Transaktionen und andere Datenbankoperationen können einmal im Code einer gespeicherten Prozedur geschrieben und von mehreren Clientanwendungen ausgeführt werden. Fehler, Ausnahmen und Parallelitätsverletzungen können von serverseitigem Code behandelt werden. Dadurch kann die Anzahl an Roundtrips von Clientanwendungen verringert werden. Code in gespeicherten Prozeduren kann ohne Auswirkungen auf Clientanwendungen geändert werden, solange die Signatur der gespeicherten Prozedur unverändert bleibt.

  • Vorhersagbarkeit. Datenbankadministratoren müssen häufig sicherstellen, dass von Clientanwendungen keine ineffizienten Abfragen gestellt werden, die die Serverleistung nachteilig beeinflussen können. Abfragen in gespeicherten Prozeduren können einzeln optimiert werden, um akzeptable Ausführungspläne zu erzeugen. Zusätzlich zur Optimierung vereinfachen gut geschriebene gespeicherte Prozeduren die Problembehandlung von Problemen auf dem Server, wie beispielsweise Blockierung und Deadlocks.

  • Leistung. In einigen Situationen können durch die Verwendung von gespeicherten Prozeduren Leistungsgewinne erzielt werden. Moderne Datenbankmodule verarbeiten dynamische SQL-Anweisungen genauso effizient wie Anweisungen in gespeicherten Prozeduren. Datenbankadministratoren behalten mehr Kontrolle über die Leistung, indem sie die Verwendung von gespeicherten Prozeduren erzwingen.

Gespeicherte Prozeduren, die Daten zurückgeben, werden von benannten Funktionen im EDM-Objektmodell aufgerufen. Gespeicherte Prozeduren, mit denen Daten aktualisiert werden, sind Entitäten und Zuordnungen zugeordnet und werden implizit aufgerufen, wenn die durch sie definierten Operationen vom System generierte Methoden verwenden würden, sofern die gespeicherten Prozeduren nicht implementiert und zugeordnet wären.

In diesem Thema werden die gespeicherten Prozeduren beschrieben, die zum Aktualisieren von Daten durch die im Schemaelement ModificationFunctionMapping angegebenen Mappings verwendet werden. Gespeicherte Prozeduren, die Daten abrufen, verwenden das FunctionImportMapping-Element. Informationen für einen Schnelleinstieg in gespeicherte Prozeduren, die Daten abrufen, diese jedoch nicht ändern, finden Sie unter Gewusst wie: Definieren eines Modells mit einer gespeicherten Prozedur (Entity Framework).

Ein weiteres Szenario, in dem gespeicherte Prozeduren verwendet werden können, ist das Einfügen oder das Löschen einer Instanz einer Zuordnung zwischen vorhandenen Entitäten. Das Mapping gespeicherter Prozeduren zu diesen Operationen wird in Mapping von Zuordnungssätzen zu gespeicherten Prozeduren (Entity Framework) beschrieben.

Standardmäßig werden Operationen von Entity Framework auf der Grundlage von Mappings zwischen dem konzeptionellen Schema und dem Speicherschema direkt auf Datenbanktabellen angewendet. Wird Entity Framework für die Verwendung von gespeicherten Prozeduren zum Aktualisieren von Daten konfiguriert, sind Änderungen am Speicherschema und am Mappingschema erforderlich.

Die folgende Tabelle enthält Links zu Themen, die die Verwendung von gespeicherten Prozeduren in den zahlreichen von EDM unterstützten Szenarien erläutern.

Operation SSDL-Anforderungen MSL-Anforderungen CSDL-Anforderungen

Ausführen einer Abfrage, die Entitätsobjekte zurückgibt. Weitere Informationen finden Sie unter Gewusst wie: Definieren eines Modells mit einer gespeicherten Prozedur (Entity Framework).

Fügen Sie im Schema-Element der Speichermodelldatei ein Function-Element hinzu. Dieses Element verweist auf eine gespeicherte Prozedur, die einen Entitätstyp zurückgibt.

Fügen Sie im EntityContainerMapping-Element der Datei des konzeptionellen Modells ein FunctionImportMapping-Element hinzu.

Fügen Sie im EntityContainer-Element der Datei des konzeptionellen Modells ein FunctionImport-Element hinzu.

Gespeicherte Prozeduren werden zum Einfügen, Aktualisieren und Löschen von Entitätsdaten verwendet. Weitere Informationen finden Sie unter Gewusst wie: Definieren eines Modells mit gespeicherten Prozeduren für Änderungen (Entity Framework).

Fügen Sie im Schema-Element der Speichermodelldatei Function-Elemente hinzu. Führen Sie dies für jede gespeicherte Prozedur zum Einfügen, Aktualisieren und Löschen einmal durch.

Fügen Sie im EntityTypeMapping-Element für den Entitätstyp ein ModificationFunctionMapping-Element hinzu. Dieses Element muss die Elemente InsertFunction, UpdateFunction und DeleteFunction für die gespeicherten Prozeduren zum Einfügen, Aktualisieren und Löschen definieren. Wenn die Entität über Beziehungen verfügt, gibt ein AssociationEnd-Element die Zuordnung an.

Keine.

Gespeicherte Prozeduren werden verwendet, um m:n-Beziehungen zwischen Entitätstypen, die mithilfe von Linktabellen in der Datenquelle implementiert sind, zu erstellen oder zu löschen. Weitere Informationen finden Sie unter Mapping von Zuordnungssätzen zu gespeicherten Prozeduren (Entity Framework).

Fügen Sie im Schema-Element der Speichermodelldatei Function-Elemente hinzu. Führen Sie dies für jede gespeicherte Prozedur, die Beziehungen in der Datenquelle erstellt oder löscht, einmal durch.

Fügen Sie im AssociationSetMapping-Element für die Zuordnung ein ModificationFunctionMapping-Element hinzu. Dieses Element muss das InsertFunction-Element und das DeleteFunction-Element für die gespeicherten Prozeduren definieren, die Beziehungen für diese Zuordnung erstellen und löschen.

Keine.

Datenänderungen und gespeicherte Prozeduren

Für Datenänderungen verwendete gespeicherte Prozeduren ersetzen die von Entity Framework generierten Methoden. Gespeicherte Prozeduren werden implizit aufgerufen, sodass keine Änderungen an dem im konzeptionellen Schema definierten EDM oder am vorhandenen Code der Anwendung erforderlich sind.

CSDL

Im folgenden Segment der konzeptionellen Schemadefinitionssprache (CSDL) werden eine SalesOrderHeader-Entität und eine SalesOrderDetail-Entität definiert. Beide Typen basieren auf der "AdventureWorks"-Beispieldatenbank, die im Lieferumfang von SQL Server 2005 und SQL Server 2008 enthalten ist. Für die Verwendung von gespeicherten Prozeduren zum Ändern von EDM-Daten sind zwar keine CSDL-Änderungen am CSDL-Schema erforderlich, das CSDL-Schema wird hier jedoch der Vollständigkeit halber dargestellt. In diesem Schema werden einige Eigenschaftendefinitionen aus Gründen der Übersichtlichkeit weggelassen. Das vollständige Schema finden Sie in dem Beispiel unter AdventureWorks Sales-Modell (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>

Weitere Informationen zu CSDL finden Sie unter Konzeptionelles Schema (CSDL).

Im Beispiel verwendete gespeicherte Prozeduren

Zur Demonstration der Verwendung von gespeicherten Prozeduren werden die folgenden Datenbankskripts zur Änderung der "AdventureWorks"-Datenbank zur Verfügung gestellt. Die Skripts erstellen gespeicherte Prozeduren, die Instanzen von SalesOrderDetail im Speicher erstellen, aktualisieren und löschen.

NoteHinweis

Von der Transaktionsverwaltung in gespeicherten Prozeduren, die von Entity Framework-Daten verwendet werden, wird abgeraten, da diese zu Konflikten mit der Verarbeitung des Entity Framework führen kann.

"CreateSalesOrderDetail"-Prozedur

Das folgende Skript erstellt die gespeicherte Prozedur, die dem Speicher SalesOrderDetail-Elemente hinzufügt. Das Skript enthält Code, der zum Löschen der gespeicherten Prozedur verwendet werden kann, wenn sie nach dem Test dieses Beispiels nicht mehr benötigt wird. Um die gespeicherte Prozedur zu löschen, lassen Sie die Zeilen nach drop procedure weg, und führen Sie das Skript aus.

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"-Prozedur

Das folgende Skript erstellt die gespeicherte Prozedur, die zum Aktualisieren von SalesOrderDetail-Elementen im Speicher verwendet wird.

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"-Prozedur

Das folgende Skript erstellt die gespeicherte Prozedur, die zum Löschen von SalesOrderDetail-Elementen im Speicher verwendet wird.

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

Datenspeicherschema-Definitionssprache (SSDL)

Im Speicherschema definieren Function-Elemente die in der Datenbank verfügbaren gespeicherten Prozeduren. Geschachtelte Parameter-Elemente geben die Namen der Parameter der gespeicherten Prozeduren an, die zugeordnet werden können. Mit diesen Deklarationen wird dem Entity Framework mitgeteilt, dass gespeicherte Prozeduren in der Datenbank vorhanden sind, sie legen jedoch kein Mapping fest. Das Mapping wird im Mappingschema implementiert, wie später in diesem Thema beschrieben.

Das IsComposable-Attribut einer Funktionsdeklaration einer gespeicherten Prozedur muss auf false festgelegt sein. Diese Einstellung gibt an, dass von der Prozedur zurückgegebene Ergebnisse nicht in der FROM-Klausel anderer Entity SQL-Anweisungen verwendet werden können. Die folgenden Deklarationen im Speicherschema geben drei gespeicherte Prozeduren an: CreateSalesOrderDetail, UpdateSalesOrderDetail und 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>

Informationen zum vollständigen Speicherschema des "AdventureWorks Sales"-Modells vor dem Hinzufügen der gespeicherten Prozeduren finden Sie unter Speicherschema für AdventureWorks Sales (EDM).

Mapping-Spezifikationssprache (MSL)

Die Mappingspezifikation definiert das Mapping zwischen im Speicherschema deklarierten Funktionen und in der Datenbank verfügbaren gespeicherten Prozeduren.

Das ModificationFunctionMapping-Element unter dem EntityTypeMapping-Element für eine EntitySetMapping beschreibt, welche in der SSDL-Datei angegebenen Funktionen die Verarbeitung der Änderungen behandeln sollen. Zu den untergeordneten Elemente gehören DeleteFunction, InsertFunction und UpdateFunction. Jedes Funktionsmapping gibt den FunctionName für die gespeicherte Prozedur an, die zugeordnet wird.

Durch das AssociationEnd-Element in der EntityTypeMapping können Sie eine Beziehung als Verweis oder als Fremdschlüssel behandeln, der als Basis für eine Zuordnung dient, die die Entität einer anderen Entität zuordnet. Informationen zum Erstellen oder Löschen von Zuordnungen zwischen vorhandenen Entitäten durch gespeicherte Prozeduren finden Sie unter Mapping von Zuordnungssätzen zu gespeicherten Prozeduren (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>

Um das Mappingschema für das "AdventureWorks"-Modell vor dem Hinzufügen von gespeicherten Prozeduren zu untersuchen, lesen Sie die Informationen unter AdventureWorks Sales-Mappingschema (EDM).

Steuerung der vollständigen Parallelität

Das Version-Attribut des ScalarProperty-Elements unterstützt die Verwendung der Steuerung von Aktualisierungs- und Löschvorgängen durch vollständige Prallelität. Sie können ein Version-Attribut festlegen, das entweder den Wert original (Daten enthalten die ursprünglich aus der Datenbank ausgelesenen Werte) hat, oder den Wert current (Daten wurden möglicherweise durch Clientcode geändert) hat. Die Angabe der Version ist in den Mappings der Aktualisierungsfunktion erforderlich. Für Mappings der Löschfunktion ist die Angabe der Version optional. Für Einfügevorgänge ist keine Steuerung der vollständigen Parallelität erforderlich, da keine gegen die Datenquelle zu prüfenden ursprünglichen Werte vorliegen.

Durch das Festlegen des Version-Attributs können gespeicherte Prozeduren bei der Steuerung der vollständigen Parallelität sowohl alte als auch neue Werte als Parameter übernehmen. So können Sie gewährleisten, dass Daten nur dann aktualisiert oder gelöscht werden, wenn die in der Datenquelle vorhandenen Daten noch den von der Anwendung zuletzt aus der Datenquelle abgerufenen Daten entsprechen.

An die ursprünglichen Versionen von Entitätseigenschaften gebundene Eingabeparameter werden in der WHERE-Klausel einer UPDATE- oder DELETE-Anweisung in einer gespeicherten Prozedur verwendet. Bei Aktualisierungen werden an die aktuellen Versionen von Entitätseigenschaften gebundene zusätzliche Parameter in der SET-Klausel einer UPDATE-Anweisung in einer gespeicherten Prozedur verwendet. Dadurch wird sichergestellt, dass die neuen (aktuellen) Werte der Datenquelle nur dann zugewiesen werden, wenn die ursprünglichen Werte noch mit den Werten in der Datenquelle übereinstimmen. Die Aktualisierung bzw. das Löschen schlägt fehl, wenn ein anderer Benutzer oder eine andere Anwendung seit dem Abruf der ursprünglichen Werte diese in der Datenquelle geändert hat.

Abrufen von Serverwerten

Für Einfügevorgänge und Aktualisierungen unterstützt ein zusätzliches untergeordnetes Element, ResultBinding, die Rückgabe von Werten, die vom Server generiert werden, durch ein Resultset. Das ResultBinding-Element gibt an, wie Rückgabewerte Entitätseigenschaften entsprechen. Außerdem ermöglicht dieses Element der Aktualisierungspipeline, Werte in Objekten auf der Basis des konzeptionellen Modells festzulegen.

Das ResultBinding-Element verfügt über ein Name-Attribut, das dem Namen der Eigenschaft in der referenzierten Entitätsdefinition entspricht, sowie über ein ColumnName-Attribut, das dem Namen einer Spalte in dem durch die gespeicherte Prozedur zurückgegebenen Resultset entspricht. Das ResultBinding-Element wird im folgenden Schemasegment dargestellt.

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

Verwenden Sie im Code der gespeicherten Prozedur eine SELECT-Anweisung, nachdem die INSERT- oder die UPDATE-Anweisung ausgeführt wurde, um den an ResultBinding übergebenen Wert abzurufen.

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

Siehe auch

Aufgaben

Gewusst wie: Definieren eines Modells mit einer gespeicherten Prozedur (Entity Framework)

Konzepte

ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)
Entity Framework-Ressourcen
Entity Framework-Terminologie
Mapping von Zuordnungssätzen zu gespeicherten Prozeduren (Entity Framework)

Weitere Ressourcen

EDM-Spezifikationen
Schemas und Mappingspezifikation (Entity Framework)
Exemplarische Vorgehensweise: Zuordnen einer Entität zu gespeicherten Prozeduren