연결 집합을 저장 프로시저에 매핑(Entity Framework)
AssociationSetMapping 내의 ModificationFunctionMapping 요소는 Entity Framework 내 엔터티 간의 연결 인스턴스를 삽입 및 삭제하는 저장 프로시저를 지정합니다. AssociationSetMapping 내의 ModificationFunctionMapping은 일반적으로 데이터베이스의 링크 테이블에서 지원되는 다 대 다 연결을 매핑할 때 유용합니다.
AdventureWorks 샘플 데이터베이스에 있는 SalesOrderDetail
및 SalesOrderHeader
간의 관계와 같은 외래 키 관계를 매핑하는 경우 ModificationFunctionMappingEntityTypeMapping에 AssociationEnd 바인딩 기술을 사용합니다. 자세한 내용은 저장 프로시저 지원(Entity Framework)을 참조하십시오.
AssociationSetMapping의 최상위 요소는 ModificationFunctionMapping 요소입니다. DeleteFunction 및 InsertFunction 자식 요소는 연결의 두 End에 대한 매개 변수 바인딩을 설명합니다.
DeleteFunction 및 InsertFunction의 FunctionName 특성은 두 경우 모두 저장소 모델에서 참조되는 저장 프로시저의 이름입니다.
참고 |
---|
연결은 수정할 수 없으므로 연결 집합에 대한 UpdateFunction 요소는 없습니다. 연결은 만들거나 삭제할 수만 있습니다. |
연결의 저장 프로시저 매핑에서 선언된 EndProperty 바인딩은 EntitySetMapping에서 선언된 AssociationEnd 요소와 비슷하지만, 부모 요소에서 AssociationSet을 나타내기 때문에 컨텍스트가 덜 필요합니다. ScalarProperty 자식 요소는 연결 End의 키 값에 대한 매개 변수 바인딩 및 저장 프로시저의 해당 매개 변수에 대해 설명합니다.
다음 예제에서는 Contact_Address
연결을 지원하는 다 대 다 링크 테이블에 항목을 만들고 삭제하는 삽입 및 삭제 함수를 매핑합니다.
<AssociationSetMapping Name="Contact_Address"
TypeName="ContactInformationModel.Contact_Address"
StoreEntitySet="Contact_Address">
<EndProperty Name="Address">
<ScalarProperty Name="AddressID" ColumnName="AddressID" />
</EndProperty>
<EndProperty Name="Contact">
<ScalarProperty Name="ContactID" ColumnName="ContactID" />
</EndProperty>
<ModificationFunctionMapping>
<DeleteFunction
FunctionName="ContactInformationModel.Store.DeleteAddress">
<EndProperty Name="Address">
<ScalarProperty Name="AddressID" ParameterName="AddressID"/>
</EndProperty>
<EndProperty Name="Contact">
<ScalarProperty Name="ContactID" ParameterName="ContactID"/>
</EndProperty>
</DeleteFunction>
<InsertFunction
FunctionName="ContactInformationModel.Store.SetAddress">
<EndProperty Name="Address">
<ScalarProperty Name="AddressID" ParameterName="AddressID"/>
</EndProperty>
<EndProperty Name="Contact">
<ScalarProperty Name="ContactID" ParameterName="ContactID"/>
</EndProperty>
</InsertFunction>
</ModificationFunctionMappi
이 예제에서 사용된 데이터베이스를 만들려면 다음 스크립트를 실행합니다.
USE [master]
GO
CREATE DATABASE [ContactInformation]
GO
USE [ContactInformation]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Address]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Address](
[AddressID] [int] NOT NULL,
[StreetAddress] [nvarchar](50) NOT NULL,
[City] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED
(
[AddressID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Contact]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Contact](
[ContactID] [int] NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Contact] PRIMARY KEY CLUSTERED
(
[ContactID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Contact_Address]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Contact_Address](
[ContactID] [int] NOT NULL,
[AddressID] [int] NOT NULL
) ON [PRIMARY]
END
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Address]') AND parent_object_id = OBJECT_ID(N'[dbo].[Contact_Address]'))
ALTER TABLE [dbo].[Contact_Address] WITH CHECK ADD CONSTRAINT [FK_Address] FOREIGN KEY([AddressID])
REFERENCES [dbo].[Address] ([AddressID])
GO
ALTER TABLE [dbo].[Contact_Address] CHECK CONSTRAINT [FK_Address]
GO
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Contact]') AND parent_object_id = OBJECT_ID(N'[dbo].[Contact_Address]'))
ALTER TABLE [dbo].[Contact_Address] WITH CHECK ADD CONSTRAINT [FK_Contact] FOREIGN KEY([ContactID])
REFERENCES [dbo].[Contact] ([ContactID])
GO
ALTER TABLE [dbo].[Contact_Address] CHECK CONSTRAINT [FK_Contact]
이 예제에서 사용된 저장 프로시저를 만들려면 다음 스크립트를 실행합니다.
연결 인스턴스를 만드는 데 사용되는 함수를 만들려면 다음 스크립트를 사용합니다.
USE [ContactInformation]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID ( 'dbo.SetAddress', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.SetAddress;
GO
CREATE PROCEDURE [dbo].[SetAddress]
@ContactID int,
@AddressID int
AS
INSERT Contact_Address(ContactID, AddressID)
VALUES(@ContactID, @AddressID)
연결 인스턴스를 삭제하는 데 사용되는 함수를 만들려면 다음 스크립트를 사용합니다.
USE [ContactInformation]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID ( 'dbo.DeleteAddress', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.DeleteAddress;
GO
CREATE PROCEDURE [dbo].[DeleteAddress]
@ContactID int,
@AddressID int
AS
Delete Contact_Address
WHERE ContactID = @ContactID
AND AddressID = @AddressID
아래에 표시된 전체 .edmx 스키마는 AssociationSetMapping 및 ModificationFunctionMapping을 구현하기 위해 수동으로 수정되었습니다. Entity Framework 디자이너 도구는 ModificationFunctionMapping의 AssociationSetMapping 구현을 지원하지 않습니다.
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0"
xmlns:edmx="https://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:Runtime>
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="ContactInformationModel.Store" Alias="Self"
Provider="System.Data.SqlClient" ProviderManifestToken="2005"
xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="Address"
EntityType="ContactInformationModel.Store.Address"
store:Type="Tables" />
<EntitySet Name="Contact"
EntityType="ContactInformationModel.Store.Contact"
store:Type="Tables" />
<EntitySet Name="Contact_Address"
EntityType="ContactInformationModel.Store.Contact_Address"
store:Type="Tables" store:Schema="dbo"
store:Name="Contact_Address">
<DefiningQuery>
SELECT
[Contact_Address].[ContactID] AS [ContactID],
[Contact_Address].[AddressID] AS [AddressID]
FROM [dbo].[Contact_Address] AS [Contact_Address]
</DefiningQuery>
</EntitySet>
<AssociationSet Name="FK_Address"
Association="ContactInformationModel.Store.FK_Address">
<End Role="Address" EntitySet="Address" />
<End Role="Contact_Address" EntitySet="Contact_Address" />
</AssociationSet>
<AssociationSet Name="FK_Contact"
Association="ContactInformationModel.Store.FK_Contact">
<End Role="Contact" EntitySet="Contact" />
<End Role="Contact_Address" EntitySet="Contact_Address" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Address">
<Key>
<PropertyRef Name="AddressID" />
</Key>
<Property Name="AddressID" Type="int" Nullable="false" />
<Property Name="StreetAddress" Type="nvarchar"
Nullable="false" MaxLength="50" />
<Property Name="City" Type="nvarchar"
Nullable="false" MaxLength="50" />
</EntityType>
<EntityType Name="Contact">
<Key>
<PropertyRef Name="ContactID" />
</Key>
<Property Name="ContactID" Type="int" Nullable="false" />
<Property Name="LastName" Type="nvarchar"
Nullable="false" MaxLength="50" />
<Property Name="FirstName" Type="nvarchar"
Nullable="false" MaxLength="50" />
</EntityType>
<EntityType Name="Contact_Address">
<Key>
<PropertyRef Name="ContactID" />
<PropertyRef Name="AddressID" />
</Key>
<Property Name="ContactID" Type="int" Nullable="false" />
<Property Name="AddressID" Type="int" Nullable="false" />
</EntityType>
<Association Name="FK_Address">
<End Role="Address"
Type="ContactInformationModel.Store.Address"
Multiplicity="1" />
<End Role="Contact_Address"
Type="ContactInformationModel.Store.Contact_Address"
Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Address">
<PropertyRef Name="AddressID" />
</Principal>
<Dependent Role="Contact_Address">
<PropertyRef Name="AddressID" />
</Dependent>
</ReferentialConstraint>
</Association>
<Association Name="FK_Contact">
<End Role="Contact"
Type="ContactInformationModel.Store.Contact"
Multiplicity="1" />
<End Role="Contact_Address"
Type="ContactInformationModel.Store.Contact_Address"
Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Contact">
<PropertyRef Name="ContactID" />
</Principal>
<Dependent Role="Contact_Address">
<PropertyRef Name="ContactID" />
</Dependent>
</ReferentialConstraint>
</Association>
<Function Name="DeleteAddress"
Aggregate="false" BuiltIn="false"
NiladicFunction="false" IsComposable="false"
ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="ContactID" Type="int" Mode="In" />
<Parameter Name="AddressID" Type="int" Mode="In" />
</Function>
<Function Name="SetAddress" Aggregate="false" BuiltIn="false"
NiladicFunction="false" IsComposable="false"
ParameterTypeSemantics="AllowImplicitConversion"
Schema="dbo">
<Parameter Name="ContactID" Type="int" Mode="In" />
<Parameter Name="AddressID" Type="int" Mode="In" />
</Function>
</Schema>
</edmx:StorageModels>
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema Namespace="ContactInformationModel" Alias="Self"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="ContactInformationEntities">
<EntitySet Name="Addresses"
EntityType="ContactInformationModel.Address" />
<EntitySet Name="Contacts"
EntityType="ContactInformationModel.Contact" />
<AssociationSet Name="Contact_Address"
Association="ContactInformationModel.Contact_Address">
<End Role="Address" EntitySet="Addresses" />
<End Role="Contact" EntitySet="Contacts" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Address">
<Key>
<PropertyRef Name="AddressID" />
</Key>
<Property Name="AddressID" Type="Int32" Nullable="false" />
<Property Name="StreetAddress" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="City" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<NavigationProperty Name="Contact"
Relationship="ContactInformationModel.Contact_Address"
FromRole="Address" ToRole="Contact" />
</EntityType>
<EntityType Name="Contact">
<Key>
<PropertyRef Name="ContactID" />
</Key>
<Property Name="ContactID" Type="Int32" Nullable="false" />
<Property Name="LastName" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="FirstName" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<NavigationProperty Name="Address"
Relationship="ContactInformationModel.Contact_Address"
FromRole="Contact" ToRole="Address" />
</EntityType>
<Association Name="Contact_Address">
<End Role="Address"
Type="ContactInformationModel.Address" Multiplicity="*" />
<End Role="Contact"
Type="ContactInformationModel.Contact" Multiplicity="*" />
</Association>
</Schema>
</edmx:ConceptualModels>
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="dbo"
CdmEntityContainer="ContactInformationEntities">
<EntitySetMapping Name="Addresses">
<EntityTypeMapping
TypeName="IsTypeOf(ContactInformationModel.Address)">
<MappingFragment StoreEntitySet="Address">
<ScalarProperty Name="AddressID" ColumnName="AddressID" />
<ScalarProperty Name="StreetAddress"
ColumnName="StreetAddress" />
<ScalarProperty Name="City" ColumnName="City" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="Contacts">
<EntityTypeMapping
TypeName="IsTypeOf(ContactInformationModel.Contact)">
<MappingFragment StoreEntitySet="Contact">
<ScalarProperty Name="ContactID" ColumnName="ContactID" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<AssociationSetMapping Name="Contact_Address"
TypeName="ContactInformationModel.Contact_Address"
StoreEntitySet="Contact_Address">
<EndProperty Name="Address">
<ScalarProperty Name="AddressID" ColumnName="AddressID" />
</EndProperty>
<EndProperty Name="Contact">
<ScalarProperty Name="ContactID" ColumnName="ContactID" />
</EndProperty>
<ModificationFunctionMapping>
<DeleteFunction
FunctionName="ContactInformationModel.Store.DeleteAddress">
<EndProperty Name="Address">
<ScalarProperty Name="AddressID"
ParameterName="AddressID"/>
</EndProperty>
<EndProperty Name="Contact">
<ScalarProperty Name="ContactID"
ParameterName="ContactID"/>
</EndProperty>
</DeleteFunction>
<InsertFunction
FunctionName="ContactInformationModel.Store.SetAddress">
<EndProperty Name="Address">
<ScalarProperty Name="AddressID"
ParameterName="AddressID"/>
</EndProperty>
<EndProperty Name="Contact">
<ScalarProperty Name="ContactID"
ParameterName="ContactID"/>
</EndProperty>
</InsertFunction>
</ModificationFunctionMapping>
</AssociationSetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>
<edmx:Designer xmlns="https://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:Connection>
<DesignerInfoPropertySet>
<DesignerProperty Name="MetadataArtifactProcessing" Value="EmbedInOutputAssembly" />
</DesignerInfoPropertySet>
</edmx:Connection>
<edmx:Options>
<DesignerInfoPropertySet>
<DesignerProperty Name="ValidateOnBuild" Value="true" />
</DesignerInfoPropertySet>
</edmx:Options>
<edmx:Diagrams >
<Diagram Name="ContactInformation">
<EntityTypeShape EntityType="ContactInformationModel.Address" PointX="0.75" PointY="0.875" Width="1.5" Height="1.787985026041667" IsExpanded="true" />
<EntityTypeShape EntityType="ContactInformationModel.Contact" PointX="3" PointY="0.875" Width="1.5" Height="1.787985026041667" IsExpanded="true" />
<AssociationConnector Association="ContactInformationModel.Contact_Address" ManuallyRouted="false">
<ConnectorPoint PointX="2.25" PointY="1.7689925130208335" />
<ConnectorPoint PointX="3" PointY="1.7689925130208335" />
</AssociationConnector>
</Diagram>
</edmx:Diagrams>
</edmx:Designer>
참고 항목
작업
방법: 저장 프로시저로 모델 정의(Entity Framework)
방법: 저장 프로시저를 사용하여 쿼리 실행(Entity Framework)
개념
저장 프로시저 지원(Entity Framework)
ModificationFunctionMapping(AssociationSetMapping)
ModificationFunctionMapping(EntityTypeMapping)