Сопоставление ключевых ограничений схемы XML (XSD) с ограничениями набора данных

В схеме можно с помощью элемента key указать ограничение ключа для элемента или атрибута. Элемент или атрибут, для которого задано ограничение ключа, должен иметь уникальные значения в любом экземпляре схемы и не может иметь значения NULL.

Ограничение ключа аналогично уникальному ограничению, за исключением того, что столбец, на котором определено ограничение ключа, не может иметь значения NULL.

В следующей таблице описаны msdata атрибуты, которые можно указать в элементе key .

Имя атрибута Описание
msdata:ConstraintName Если этот атрибут указан, его значение используется в качестве имени ограничения. name В противном случае атрибут предоставляет значение имени ограничения.
msdata:PrimaryKey Если PrimaryKey="true" присутствует, свойство ограничения IsPrimaryKey устанавливается в значение true, что делает его первичным ключом. Свойство AllowDBNull столбца имеет значение false, так как первичные ключи не могут иметь значения NULL.

При преобразовании схемы, в которой задано ограничение ключа, процесс сопоставления создает уникальное ограничение для таблицы со AllowDBNull свойством столбца, заданным false для каждого столбца в ограничении. Свойство IsPrimaryKey уникального ограничения также задано false , если вы не указали msdata:PrimaryKey="true" в элементе key . Это идентично уникальному ограничению в схеме, в которой PrimaryKey="true".

В следующем примере схемы элемент key задает ограничение ключа для элемента CustomerID.

<xs:schema id="cod"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Customers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="CustomerID" type="xs:string" minOccurs="0" />
        <xs:element name="CompanyName" type="xs:string" minOccurs="0" />
       <xs:element name="Phone" type="xs:string" />
     </xs:sequence>
   </xs:complexType>
 </xs:element>
<xs:element name="MyDataSet" msdata:IsDataSet="true">
  <xs:complexType>
    <xs:choice maxOccurs="unbounded">
      <xs:element ref="Customers" />
    </xs:choice>
  </xs:complexType>
   <xs:key  msdata:PrimaryKey="true"
       msdata:ConstraintName="KeyCustID"
          name="KeyConstCustomerID" >
     <xs:selector xpath=".//Customers" />
     <xs:field xpath="CustomerID" />
    </xs:key>
 </xs:element>
</xs:schema>

Элемент key указывает, что значения дочернего CustomerIDCustomers элемента элемента должны иметь уникальные значения и не могут иметь значения NULL. При переводе схемы определения XML-схемы (XSD) процесс сопоставления создает следующую таблицу:

Customers(CustomerID, CompanyName, Phone)

Сопоставление схемы XML также создает UniqueConstraint в столбце CustomerID, как показано в следующем примере DataSet. (Для простоты отображаются только соответствующие свойства.)

      DataSetName: MyDataSet
TableName: customers
  ColumnName: CustomerID
      AllowDBNull: False
      Unique: True
  ConstraintName: KeyCustID
      Table: customers
      Columns: CustomerID
      IsPrimaryKey: True

В DataSet, который генерируется, свойство IsPrimaryKey элемента UniqueConstraint установлено в true, потому что схема указывает msdata:PrimaryKey="true" в элементе key.

Значение свойства ConstraintName элемента UniqueConstraint в DataSet является значением атрибута msdata:ConstraintName, указанного в элементе key в схеме.

См. также