How to: Define a Model with Modification Stored Procedures
The Entity Framework enables you to specify stored procedures to be used when modifying entity data. These stored procedures replace the methods generated by the Entity Framework. Stored procedures are called implicitly, so no changes are required to the data model defined in the conceptual schema or existing application code.
Note
The recommended way to specify stored procedures for modifying entity data is to use the ADO.NET Entity Data Model Tools. For more information, see Walkthrough: Mapping an Entity to Stored Procedures and How to: Map Modification Functions to Stored Procedures.
This topic shows how to define modification stored procedures for the SalesOrderDetail entity type in the Adventure Works Sales Model. To use this example, you must have already added the AdventureWorks Sales Model to your project and configured your project to use the Entity Framework. To do this, complete the procedures in How to: Manually Configure an Entity Framework Project and How to: Manually Define the Model and Mapping Files.
Note
If you do not map all three of the insert, update, and delete operations of an entity type to stored procedures, the unmapped operations will fail if executed at runtime, and an UpdateException will be thrown.
To define modification stored procedures for the SalesOrderDetail entity type
Execute the following Transact-SQL scripts to create the modification stored procedures in the AdventureWorks database:
CreateSalesOrderDetail 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 procedure:
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 procedure:
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
Add the following function definitions to the top level Schema element of the .ssdl schema file for the AdventureWorks Sales storage model:
<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>
Insert the following XML fragment within the EntityTypeMapping element for the SalesOrderDetail in the EntitySetMapping. Do this in the .msl mapping file for the AdventureWorks Sales storage model.
<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>
See Also
Tasks
How to: Define a Model with a Stored Procedure
Other Resources
Defining Advanced Data Models
CSDL, SSDL, and MSL Specifications