다음을 통해 공유


XML 스키마 제약 조건 및 관계

XSD(XML 스키마 정의 언어) 스키마에서 제약 조건(고유, 키 및 keyref 제약 조건) 및 관계( msdata:Relationship 주석 사용)를 지정할 수 있습니다. 이 항목에서는 XML 스키마에 지정된 제약 조건 및 관계가 해석되어 생성 DataSet되는 방법을 설명합니다.

일반적으로 XML 스키마에서는 DataSet에서 관계만 생성하려는 경우 msdata:Relationship 주석을 지정합니다. 자세한 내용은 XSD(XML 스키마)에서 데이터 세트 관계 생성을 참조하세요. DataSet에서 제약 조건을 생성하려는 경우 제약 조건(고유, 키 및 keyref)을 지정합니다. 키 및 keyref 제약 조건은 이 항목의 뒷부분에서 설명한 대로 관계를 생성하는 데도 사용됩니다.

키 및 keyref 제약 조건에서 관계 생성

msdata:Relationship 주석을 지정하는 대신 XML 스키마 매핑 프로세스 중에 사용되는 키 및 keyref 제약 조건을 지정하여 제약 조건뿐만 아니라 DataSet의 관계도 생성할 수 있습니다. 그러나 요소 msdata:ConstraintOnly="true" 에서 keyref 지정 DataSet 하는 경우 제약 조건만 포함되며 관계를 포함하지 않습니다.

다음 예제에서는 중첩되지 않은 요소를 포함하는 OrderOrderDetail XML 스키마를 보여줍니다. 스키마는 키 및 keyref 제약 조건도 지정합니다.

<xs:schema id="MyDataSet" xmlns=""
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

 <xs:element name="MyDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">
      <xs:element name="OrderDetail">
       <xs:complexType>
         <xs:sequence>
           <xs:element name="OrderNo" type="xs:integer" />
           <xs:element name="ItemNo" type="xs:string" />
         </xs:sequence>
       </xs:complexType>
      </xs:element>
      <xs:element name="Order">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="OrderNumber" type="xs:integer" />
            <xs:element name="EmpNumber" type="xs:integer" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>

  <xs:key name="OrderNumberKey"  >
    <xs:selector xpath=".//Order" />
    <xs:field xpath="OrderNumber" />
  </xs:key>

  <xs:keyref name="OrderNoRef" refer="OrderNumberKey">
    <xs:selector xpath=".//OrderDetail" />
    <xs:field xpath="OrderNo" />
  </xs:keyref>
 </xs:element>
</xs:schema>

DataSet XML 스키마 매핑 프로세스 중에 생성된 데이터에는 Order 테이블과 OrderDetail 테이블이 포함됩니다. 또한 DataSet 관계 및 제약 조건이 포함됩니다. 다음 예제에서는 이러한 관계 및 제약 조건을 보여 줍니다. 스키마는 msdata:Relationship 주석을 지정하지 않습니다. 대신 키 및 keyref 제약 조건을 사용하여 관계를 생성합니다.

....ConstraintName: OrderNumberKey
....Type: UniqueConstraint
....Table: Order
....Columns: OrderNumber
....IsPrimaryKey: False

....ConstraintName: OrderNoRef
....Type: ForeignKeyConstraint
....Table: OrderDetail
....Columns: OrderNo
....RelatedTable: Order
....RelatedColumns: OrderNumber

..RelationName: OrderNoRef
..ParentTable: Order
..ParentColumns: OrderNumber
..ChildTable: OrderDetail
..ChildColumns: OrderNo
..ParentKeyConstraint: OrderNumberKey
..ChildKeyConstraint: OrderNoRef
..Nested: False

이전 스키마 예제에서 Order 요소와 OrderDetail 요소는 중첩되지 않습니다. 다음 스키마 예제에서는 이러한 요소가 중첩됩니다. 그러나 msdata:Relationship 주석은 지정되지 않습니다. 따라서 암시적 관계가 가정됩니다. 자세한 내용은 중첩된 스키마 요소 간의 암시적 관계 매핑을 참조하세요. 스키마는 키 및 keyref 제약 조건도 지정합니다.

<xs:schema id="MyDataSet" xmlns=""
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">

 <xs:element name="MyDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">

      <xs:element name="Order">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="OrderNumber" type="xs:integer" />
            <xs:element name="EmpNumber" type="xs:integer" />

            <xs:element name="OrderDetail">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="OrderNo" type="xs:integer" />
                  <xs:element name="ItemNo" type="xs:string" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:complexType>

  <xs:key name="OrderNumberKey"  >
    <xs:selector xpath=".//Order" />
    <xs:field xpath="OrderNumber" />
  </xs:key>

  <xs:keyref name="OrderNoRef" refer="OrderNumberKey">
    <xs:selector xpath=".//OrderDetail" />
    <xs:field xpath="OrderNo" />
  </xs:keyref>
 </xs:element>
</xs:schema>

XML 스키마 매핑 프로세스의 결과에는 DataSet 다음 두 개의 테이블이 포함됩니다.

Order(OrderNumber, EmpNumber, Order_Id)
OrderDetail(OrderNumber, ItemNumber, Order_Id)

DataSet 또한 두 관계(msdata:relationship 주석을 기반으로 하는 관계와 키 및 keyref 제약 조건을 기반으로 하는 관계)와 다양한 제약 조건이 포함됩니다. 다음 예제에서는 관계 및 제약 조건을 보여 줍니다.

..RelationName: Order_OrderDetail
..ParentTable: Order
..ParentColumns: Order_Id
..ChildTable: OrderDetail
..ChildColumns: Order_Id
..ParentKeyConstraint: Constraint1
..ChildKeyConstraint: Order_OrderDetail
..Nested: True

..RelationName: OrderNoRef
..ParentTable: Order
..ParentColumns: OrderNumber
..ChildTable: OrderDetail
..ChildColumns: OrderNo
..ParentKeyConstraint: OrderNumberKey
..ChildKeyConstraint: OrderNoRef
..Nested: False

..ConstraintName: OrderNumberKey
..Type: UniqueConstraint
..Table: Order
..Columns: OrderNumber
..IsPrimaryKey: False

..ConstraintName: Constraint1
..Type: UniqueConstraint
..Table: Order
..Columns: Order_Id
..IsPrimaryKey: True

..ConstraintName: Order_OrderDetail
..Type: ForeignKeyConstraint
..Table: OrderDetail
..Columns: Order_Id
..RelatedTable: Order
..RelatedColumns: Order_Id

..ConstraintName: OrderNoRef
..Type: ForeignKeyConstraint
..Table: OrderDetail
..Columns: OrderNo
..RelatedTable: Order
..RelatedColumns: OrderNumber

중첩된 테이블을 참조하는 keyref 제약 조건에 msdata:IsNested="true" 주석 DataSet 이 포함된 경우 keyref 제약 조건 및 관련 고유/키 제약 조건을 기반으로 하는 단일 중첩 관계를 만듭니다.

참고하십시오