从xsd解释的DataSet架构的问题

时间:2010-05-11 12:22:15

标签: c# xml xsd schema dataset

我有一个xsd文件,它描述了我用来将我的DataSet作为xml文件读/写到磁盘的DataSet模式。我没有手工编写模式,而是手工编写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的ad-hoc键链接,该表对每个Item都是唯一的,并映射到Offer。所以我得到一个包含列(ASIN,Title,Item_Id)的Item表和一个包含列的商品表(MerchantName,Price,Item_Id)。

这里的问题是ASIN已经是项目的唯一标识符,因此模式导入过程引入了一些冗余并使代码比它需要的更加笨拙。如何更改此架构以最终得到2个表(ASIN,Title)和(ASIN,MerchantName,Price)?

谢谢!

1 个答案:

答案 0 :(得分:2)

除非您声明了主键,否则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>