Проблема со схемой DataSet, интерпретируемой из xsd - PullRequest
1 голос
/ 11 мая 2010

У меня есть файл xsd, который описывает схему DataSet, которую я использую для чтения / записи моего DataSet на диск в виде файла xml. Я не писал схему вручную, я написал файл xml вручную, вывел схему из файла xml, а затем выписал схему xsd. (Я довольно новичок в этом ...)

В любом случае, вот схема (здесь происходит кое-что из amazon.com):

<?xml version="1.0" standalone="yes"?>
<xs:schema id="Items" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Items" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
  <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="Item">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="ASIN" type="xs:string" />
          <xs:element name="Title" type="xs:string" />
          <xs:element name="Offer" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="MerchantName" type="xs:string" />
                <xs:element name="Price" type="xs:string" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>

Когда DataSet читает схему, он создает две таблицы, связанные специальным ключом, который он создает с именем Item_Id, который уникален для каждого элемента, и сопоставляется с предложением. Таким образом, я получаю одну таблицу Item с колонками (ASIN, Title, Item_Id) и таблицу предложений с колонками (MerchantName, Price, Item_Id).

Проблема здесь в том, что ASIN уже является уникальным идентификатором для элемента, и поэтому процесс импорта схемы привнес некоторую избыточность и делает код более неудобным, чем это необходимо. Как я могу изменить эту схему, чтобы в итоге получилось 2 таблицы (ASIN, Title) и (ASIN, MerchantName, Price)?

Спасибо!

1 Ответ

2 голосов
/ 11 мая 2010

XSD-схема автоматически создает случайный Item_Id для единицы идентификации, если вы не объявили первичный ключ.

Назначение первичного ключа в вашей схеме xsd отсутствует.

<xs:unique name="Constraint1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//Item" />            
      <xs:field xpath="ASIN"/>
</xs:unique>

Таким образом, в вашем наборе данных не будет Item_Id , и ваша схема должна выглядеть следующим образом:

    <?xml version="1.0" standalone="yes"?>
    <xs:schema id="Items" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"       xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="Items" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Item">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ASIN" type="xs:string"  />
              <xs:element name="Title" type="xs:string" />
              <xs:element name="Offer" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="MerchantName" type="xs:string" />
                    <xs:element name="Price" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
                <xs:unique name="Constraint1" msdata:PrimaryKey="true">
                  <xs:selector xpath=".//Item" />            
                  <xs:field xpath="ASIN"/>
                </xs:unique>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:unique name="Constraint2" msdata:PrimaryKey="true">
      <xs:selector xpath=".//Item" />
      <xs:field xpath="ASIN" />
    </xs:unique>
  </xs:element>
</xs:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...