방법: 수정 저장 프로시저로 모델 정의(Entity Framework)
Entity Framework를 사용하면 엔터티 데이터를 수정할 때 사용할 저장 프로시저를 지정할 수 있습니다. 이러한 저장 프로시저는 Entity Framework에서 생성된 메서드를 대체합니다. 저장 프로시저는 암시적으로 호출되므로 개념 스키마 또는 기존 응용 프로그램 코드에서 정의된 데이터 모델을 변경할 필요가 없습니다.
참고: |
---|
엔터티 데이터를 수정하기 위한 저장 프로시저를 지정하려면 ADO.NET 엔터티 데이터 모델 도구를 사용하는 것이 좋습니다.자세한 내용은 Walkthrough: Mapping an Entity to Stored Procedures 및 How to: Map Modification Functions to Stored Procedures을 참조하십시오. |
이 항목에서는 AdventureWorks Sales 모델의 SalesOrderDetail 엔터티 형식에 대해 수정 저장 프로시저를 정의하는 방법을 보여 줍니다. 이 예제를 사용하려면 프로젝트에 AdventureWorks Sales 모델을 추가하고 Entity Framework를 사용하도록 프로젝트를 구성해야 합니다. 이렇게 하려면 방법: Entity Framework 프로젝트 수동 구성 및 방법: 수동으로 모델 및 매핑 파일 정의(Entity Framework)의 절차를 수행합니다.
참고: |
---|
엔터티 형식의 삽입, 업데이트 및 삭제 작업 중 일부를 저장 프로시저에 매핑하지 않은 경우 런타임에 실행하면 매핑되지 않은 작업이 실패하고 UpdateException이 throw됩니다. |
SalesOrderDetail 엔터티 형식에 대해 수정 저장 프로시저를 정의하려면
다음 Transact-SQL 스크립트를 실행하여 AdventureWorks 데이터베이스에 수정 저장 프로시저를 만듭니다.
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()
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
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
AdventureWorks Sales 저장소 모델에 대한 .ssdl 스키마 파일의 최상위 Schema 요소에 다음 함수 정의를 추가합니다.
<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>
EntitySetMapping에서 SalesOrderDetail의 EntityTypeMapping 요소 내에 다음 XML 조각을 삽입합니다. AdventureWorks Sales 저장소 모델에 대한 .msl 매핑 파일에서 이 작업을 수행합니다.
<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>
참고 항목
작업
방법: 저장 프로시저로 모델 정의(Entity Framework)