Cómo definir un modelo con procedimientos almacenados de modificación (Entity Framework)
Entity Framework le permite especificar los procedimientos almacenados que se van a utilizar al modificar los datos de la entidad. Estos procedimientos almacenados reemplazan a los métodos que Entity Framework genera. A los procedimientos almacenados se les llama implícitamente, de modo que no se requiere ningún cambio en el modelo de datos definido en el esquema conceptual o en el código de aplicación existente.
Nota: |
---|
La manera recomendada de especificar procedimientos almacenados para modificar datos de entidad consiste en utilizar las herramientas de ADO.NET Entity Data Model.Para obtener más información, vea Walkthrough: Mapping an Entity to Stored Procedures y How to: Map Modification Functions to Stored Procedures. |
En este tema se muestra cómo definir los procedimientos almacenados de modificación para el tipo de entidad SalesOrderDetail en el modelo de Adventure Works Sales. Para usar este ejemplo, debe haber agregado el modelo AdventureWorks Sales al proyecto y haber configurado el proyecto para que use Entity Framework. Para ello, complete los procedimientos de Cómo configurar manualmente un proyecto de Entity Framework y Cómo: Definir manualmente los archivos de asignación y modelo (Entity Framework).
Nota: |
---|
Si no asigna las tres operaciones de inserción, actualización y eliminación de un tipo de entidad a procedimientos almacenados, se producirá un error en las operaciones no asignadas si se ejecutan en tiempo de ejecución y se producirá una excepción UpdateException. |
Para definir los procedimientos almacenados de modificación para el tipo de entidad SalesOrderDetail
Ejecute los scripts de Transact-SQL siguientes para crear los procedimientos almacenados de modificación en la base de datos de AdventureWorks:
Procedimiento CreateSalesOrderDetail:
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()
Procedimiento UpdateSalesOrderDetail:
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
Procedimiento DeleteSalesOrderDetail:
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
Agregue las definiciones de función siguientes al elemento Schema del nivel superior del archivo de esquema .sddl para el modelo de almacenamiento de AdventureWorks Sales:
<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>
Inserte el fragmento XML siguiente dentro del elemento EntityTypeMapping para el SalesOrderDetail de EntitySetMapping. Haga esto en el archivo de asignación .msl para el modelo de almacenamiento de AdventureWorks Sales.
<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>
Vea también
Tareas
Cómo: Definir un modelo con un procedimiento almacenado (Entity Framework)
Otros recursos
Definir modelos de datos avanzados (tareas de Entity Framework)
Especificaciones CSDL, SSDL y MSL