다음을 통해 공유


방법: 사용자 지정 개체를 사용할 수 있도록 엔터티 데이터 모델 사용자 지정(Entity Framework)

EDM(엔터티 데이터 모델)에서 사용자 지정 데이터 클래스를 사용하려면 CSDL(개념 스키마 정의 언어)에 정의된 엔터티 형식과 속성이 사용자 지정 데이터 클래스와 일치해야 합니다. 엔터티 프레임워크 도구는 CSDL 파일의 엔터티 형식과 엔터티 집합을 데이터베이스의 테이블과 일치시키는 매핑 파일 집합을 생성합니다. 사용자 지정 데이터 클래스에 맞게 매핑 파일을 업데이트하는 프로세스는 다음과 같습니다.

  1. 사용자 지정 데이터 클래스와 일치하도록 CSDL 파일을 업데이트합니다.

  2. MSL(매핑 사양 언어) 파일에서 매핑을 업데이트합니다.

  3. 필요한 경우 SSDL(저장소 스키마 정의 언어) 파일을 업데이트합니다.

  4. 업데이트된 매핑 파일의 유효성을 검사합니다.

  5. Visual Studio에서 개체 계층을 생성하지 않도록 지정합니다.

이 항목의 예제를 실행하려면 우선 EDM 생성기(EdmGen.exe) 유틸리티 또는 엔터티 데이터 모델 마법사를 사용하여 EDM 매핑 파일을 생성해야 합니다. 자세한 내용은 방법: EdmGen.exe를 사용하여 엔터티 데이터 모델 생성(Entity Framework)을 참조하십시오. Visual Studio에서 엔터티 데이터 모델 디자이너를 사용하려면 업데이트된 CSDL 파일을 기반으로 한 개체 계층 생성 기능도 비활성화해야 합니다. 이렇게 하지 않으면 프로젝트에서 데이터 클래스가 중복됩니다.

사용자 지정 데이터 개체가 반영되도록 CSDL 파일을 업데이트하려면

  1. Visual Studio 또는 notepad.exe에서 CSDL 파일을 엽니다.

  2. 사용자 지정 데이터 클래스의 이름이 반영되도록 EntityTypeEntitySet 요소의 이름을 변경합니다.

  3. 해당되는 사용자 지정 데이터 클래스가 없는 모든 엔터티에 대한 EntityTypeEntitySet 요소를 제거합니다.

  4. 사용자 지정 데이터 클래스의 속성 이름과 일치하도록 각 형식의 Property 요소 이름을 변경합니다.

  5. 사용자 지정 데이터 클래스에 없는 모든 속성에 대한 Property 요소를 제거합니다.

  6. 변경 내용을 CSDL 파일에 저장합니다.

MSL 파일을 업데이트하여 사용자 지정 데이터 개체를 데이터 원본의 개체에 매핑하려면

  1. Visual Studio 또는 notepad.exe에서 MSL 파일을 엽니다.

  2. 사용자 지정 클래스의 이름이 반영되도록 EntitySetMapping 요소 및 TypeName 특성의 이름을 변경합니다.

  3. 해당되는 사용자 지정 데이터 클래스가 없는 모든 엔터티에 대한 EntitySetMapping 요소를 제거합니다.

  4. 사용자 지정 데이터 클래스의 속성 이름과 일치하도록 각 형식의 ScalarProperty 요소 이름을 변경합니다.

  5. 사용자 지정 데이터 클래스에 없는 모든 속성에 대한 ScalarProperty 요소를 제거합니다.

  6. 사용자 지정 클래스의 이름이 반영되도록 AssociationSetMappingEndProperty 요소 이름을 변경합니다.

  7. 사용자 지정 데이터 클래스의 속성 이름과 일치하도록 각 AssociationSetMappingScalarProperty 요소 이름을 변경합니다.

    Note참고

    ColumnName 속성은 변경하지 마십시오.

  8. 사용자 지정 데이터 클래스에 없는 모든 엔터티 간의 연결에 대한 AssociationSetMapping 요소를 제거합니다.

  9. 변경 내용을 MSL 파일에 저장합니다.

SSDL 파일을 업데이트하여 사용자 지정 데이터 클래스에 없는 엔터티를 제거하려면

  1. Visual Studio 또는 notepad.exe에서 SSDL 파일을 엽니다.

  2. 사용자 지정 데이터 클래스에 매핑되지 않은 모든 엔터티에 대한 EntityType 요소를 제거합니다.

  3. 사용자 지정 데이터 클래스의 속성에 매핑되지 않은 모든 속성에 대한 ScalarProperty 요소를 제거합니다.

  4. 변경 내용을 SSDL 파일에 저장합니다.

업데이트된 매핑 파일의 유효성을 검사하려면

  1. 매핑 파일이 있는 디렉터리에서 EdmGen.exe 유틸리티를 실행합니다. 다음 명령을 사용합니다.

    %windir%\Microsoft.NET\Framework\v3.5\edmgen.exe /mode:ValidateArtifacts  
    /inssdl:.\YourModel.ssdl /inmsl:.\YourModel.msl /incsdl:.\YourModel.csdl 
    
    Note참고

    줄 바꿈을 제거하고 YourModel을 해당 매핑 파일에 사용되는 이름으로 바꿉니다.

  2. 출력 내용을 검토하고 유효성 검사 오류를 정정합니다.

자동 생성되는 개체 코드를 다시 생성하고, 저장하고, 제거하려면

  1. Visual Studio의 솔루션 탐색기에서 CSDL**파일을 마우스 오른쪽 단추로 클릭하고 사용자 지정 도구 실행을 선택합니다.

    이렇게 하면 수정된 CSDL 파일을 기반으로 개체 계층이 다시 생성됩니다.

  2. CSDL 파일 노드를 확장하고, 디자이너 파일을 열고, 파일을 다른 이름으로 저장합니다.

    이렇게 하면 자동 생성된 개체 계층 파일이 저장됩니다. 이 파일의 코드는 방법: 사용자 지정 개체에 개체 서비스 사용(Entity Framework)에서 사용됩니다.

  3. 프로젝트에서 디자이너 파일을 제외합니다.

  4. CSDL 파일을 선택하고 속성 창에서 사용자 지정 도구 값을 지웁니다.

    그러면 개체 계층 파일이 다시 생성되지 않습니다. 나중에 이 파일을 생성하려면 속성 창에서 사용자 지정 도구에 대해 EntityModelCodeGenerator를 입력하고 1단계를 반복합니다.

예제

다음 CSDL 파일은 OrdersLineItem 사용자 지정 데이터 클래스를 지원하도록 사용자 지정되었습니다.

<Schema Namespace="Microsoft.Samples.Edm" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
  <EntityContainer Name="SalesOrdersEntities">
    <EntitySet Name="LineItem" EntityType="Microsoft.Samples.Edm.LineItem" />
    <EntitySet Name="Order" EntityType="Microsoft.Samples.Edm.Order" />
    <AssociationSet Name="FK_LineItem_Order_OrderId" Association="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId">
      <End Role="Order" EntitySet="Order" />
      <End Role="LineItem" EntitySet="LineItem" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="LineItem">
    <Key>
      <PropertyRef Name="LineItemId" />
    </Key>
    <Property Name="LineItemId" Type="Int32" Nullable="false" />
    <Property Name="TrackingNumber" Type="String" MaxLength="25" />
    <Property Name="Quantity" Type="Int16" Nullable="false" />
    <Property Name="Product" Type="Int32" Nullable="false" />
    <Property Name="Price" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="Discount" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <NavigationProperty Name="Order" Relationship="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" 
                        FromRole="LineItem" ToRole="Order" />
  </EntityType>
  <EntityType Name="Order">
    <Key>
      <PropertyRef Name="OrderId" />
    </Key>
    <Property Name="OrderId" Type="Int32" 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="Customer" Type="Int32" Nullable="false" />
    <Property Name="SubTotal" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="TaxAmt" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="Freight" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
    <Property Name="ExtendedInfo" Type="Self.OrderInfo" Nullable="false" />
    <NavigationProperty Name="LineItem" Relationship="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" 
                        FromRole="Order" ToRole="LineItem" />
  </EntityType>
    <ComplexType Name="OrderInfo">
        <Property Name="OrderNumber" Type="String" Nullable="false" MaxLength="25" />
        <Property Name="PurchaseOrder" Type="String" MaxLength="25" />
        <Property Name="AccountNumber" Type="String" MaxLength="15" />
        <Property Name="Comment" Type="String" MaxLength="128" />
    </ComplexType>
  <Association Name="FK_LineItem_Order_OrderId">
    <End Role="Order" Type="Microsoft.Samples.Edm.Order" Multiplicity="1" />
    <End Role="LineItem" Type="Microsoft.Samples.Edm.LineItem" Multiplicity="*" />
  </Association>
</Schema>

다음 MSL 파일은 OrdersLineItem 사용자 지정 데이터 클래스를 AdventureWorks 데이터베이스의 SalesOrderHeaderSalesOrderDetail 테이블에 매핑하도록 사용자 지정되었습니다.

<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
  <EntityContainerMapping StorageEntityContainer="Sales" CdmEntityContainer="SalesOrdersEntities">
    <EntitySetMapping Name="LineItem" StoreEntitySet="SalesOrderDetail" TypeName="Microsoft.Samples.Edm.LineItem">
      <ScalarProperty Name="LineItemId" ColumnName="SalesOrderDetailID" />
      <ScalarProperty Name="TrackingNumber" ColumnName="CarrierTrackingNumber" />
      <ScalarProperty Name="Quantity" ColumnName="OrderQty" />
      <ScalarProperty Name="Product" ColumnName="ProductID" />
      <ScalarProperty Name="Price" ColumnName="UnitPrice" />
      <ScalarProperty Name="Discount" ColumnName="UnitPriceDiscount" />
    </EntitySetMapping>
    <EntitySetMapping Name="Order" StoreEntitySet="SalesOrderHeader" TypeName="Microsoft.Samples.Edm.Order">
      <ScalarProperty Name="OrderId" ColumnName="SalesOrderID" />
      <ScalarProperty Name="OrderDate" ColumnName="OrderDate" />
      <ScalarProperty Name="DueDate" ColumnName="DueDate" />
      <ScalarProperty Name="ShipDate" ColumnName="ShipDate" />
      <ScalarProperty Name="Status" ColumnName="Status" />
      <ScalarProperty Name="Customer" ColumnName="CustomerID" />
      <ScalarProperty Name="SubTotal" ColumnName="SubTotal" />
      <ScalarProperty Name="TaxAmt" ColumnName="TaxAmt" />
      <ScalarProperty Name="Freight" ColumnName="Freight" />
      <ComplexProperty Name ="ExtendedInfo" TypeName ="Microsoft.Samples.Edm.OrderInfo">
        <ScalarProperty Name="OrderNumber" ColumnName="SalesOrderNumber" />
        <ScalarProperty Name="PurchaseOrder" ColumnName="PurchaseOrderNumber" />
        <ScalarProperty Name="AccountNumber" ColumnName="AccountNumber" />
        <ScalarProperty Name="Comment" ColumnName="Comment" />
      </ComplexProperty>
    </EntitySetMapping>
    <AssociationSetMapping Name="FK_LineItem_Order_OrderId" TypeName="Microsoft.Samples.Edm.FK_LineItem_Order_OrderId" StoreEntitySet="SalesOrderDetail">
      <EndProperty Name="Order">
        <ScalarProperty Name="OrderId" ColumnName="SalesOrderID" />
      </EndProperty>
      <EndProperty Name="LineItem">
        <ScalarProperty Name="LineItemId" ColumnName="SalesOrderDetailID" />
      </EndProperty>
      <Condition ColumnName="SalesOrderID" IsNull="false" />
    </AssociationSetMapping>
  </EntityContainerMapping>
</Mapping>

다음 SSDL 파일은 AdventureWorks 데이터베이스의 SalesOrderHeaderSalesOrderDetail 테이블을 사용하여 OrdersLineItem 사용자 지정 데이터 클래스를 지원하도록 사용자 지정되었습니다.

<Schema Namespace="Microsoft.Samples.Edm.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
  <EntityContainer Name="Sales">
    <EntitySet Name="SalesOrderDetail" EntityType="Microsoft.Samples.Edm.Store.SalesOrderDetail" />
    <EntitySet Name="SalesOrderHeader" EntityType="Microsoft.Samples.Edm.Store.SalesOrderHeader" />
    <AssociationSet Name="FK_LineItem_Orders_OrderId" Association="Microsoft.Samples.Edm.Store.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
      <End Role="SalesOrderHeader" EntitySet="SalesOrderHeader" />
      <End Role="SalesOrderDetail" EntitySet="SalesOrderDetail" />
    </AssociationSet>
  </EntityContainer>
  <EntityType Name="SalesOrderDetail">
    <Key>
      <PropertyRef Name="SalesOrderDetailID" />
    </Key>
    <Property Name="SalesOrderID" Type="int" Nullable="false" />
    <Property Name="SalesOrderDetailID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
    <Property Name="CarrierTrackingNumber" Type="nvarchar" MaxLength="25" />
    <Property Name="OrderQty" Type="smallint" Nullable="false" />
    <Property Name="ProductID" Type="int" Nullable="false" />
    <Property Name="UnitPrice" Type="money" Nullable="false" />
    <Property Name="UnitPriceDiscount" Type="money" Nullable="false" />
  </EntityType>
  <EntityType Name="SalesOrderHeader">
    <Key>
      <PropertyRef Name="SalesOrderID" />
    </Key>
    <Property Name="SalesOrderID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
    <Property Name="OrderDate" Type="datetime" Nullable="false" />
    <Property Name="DueDate" Type="datetime" Nullable="false" />
    <Property Name="ShipDate" Type="datetime" />
    <Property Name="Status" Type="tinyint" Nullable="false" />
    <Property Name="SalesOrderNumber" Type="nvarchar" Nullable="false" StoreGeneratedPattern="Computed" MaxLength="25" />
    <Property Name="PurchaseOrderNumber" Type="nvarchar" MaxLength="25" />
    <Property Name="AccountNumber" Type="nvarchar" MaxLength="15" />
    <Property Name="CustomerID" Type="int" Nullable="false" />
    <Property Name="SubTotal" Type="money" Nullable="false" />
    <Property Name="TaxAmt" Type="money" Nullable="false" />
    <Property Name="Freight" Type="money" Nullable="false" />
    <Property Name="Comment" Type="nvarchar" MaxLength="128" />
  </EntityType>
  <Association Name="FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID">
    <End Role="SalesOrderHeader" Type="Microsoft.Samples.Edm.Store.SalesOrderHeader" Multiplicity="1" />
    <End Role="SalesOrderDetail" Type="Microsoft.Samples.Edm.Store.SalesOrderDetail" Multiplicity="*" />
    <ReferentialConstraint>
      <Principal Role="SalesOrderHeader">
        <PropertyRef Name="SalesOrderID" />
      </Principal>
      <Dependent Role="SalesOrderDetail">
        <PropertyRef Name="SalesOrderID" />
      </Dependent>
    </ReferentialConstraint>
  </Association>
</Schema>

참고 항목

개념

개체 사용자 지정(Entity Framework)

기타 리소스

스키마 및 매핑 사양(Entity Framework)
사용자 지정 개체 사용(Entity Framework 작업)