我有一个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)?
谢谢!
答案 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>