为什么ReadXmlSchema会创建额外的“ID”列

时间:2012-09-24 20:30:35

标签: c# xml xsd dataset

给定一个XSD文件,如下所示的代码会在返回的DataSet中的两个DataTable中生成一个额外的(和不需要的)列。

ds.ReadXmlSchema(s);

两个DataTable都有一个Order_Id列;其他列与XSD完美匹配。

之前有其他人见过吗?

下面的XSD文件:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Order">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Item" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType msdata:AutoIncrement="false">
            <xs:attribute name="itemId" type="xs:unsignedInt" />
            <xs:attribute name="stockCode" type="xs:string" />
            <xs:attribute name="stockCodeType" type="xs:string" />
            <xs:attribute name="Quantity" type="xs:unsignedLong" />
            <xs:attribute name="ProductIdX" type="xs:unsignedInt" />
            <xs:attribute name="legalEntity" type="xs:string" />
            <xs:attribute name="countryOfIssue" type="xs:string" />
            <xs:attribute name="branchSystem" type="xs:string" />
            <xs:attribute name="accountId" type="xs:string" />
            <xs:attribute name="settlementDate" type="xs:string" />
            <xs:attribute name="tradeDate" type="xs:string" />
            <xs:attribute name="partyCode" type="xs:string" />
            <xs:attribute name="userId" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="OrderId" type="xs:unsignedInt" />
      <xs:attribute name="StrategyId" type="xs:string" />
      <xs:attribute name="ActivityId" type="xs:string" />
    </xs:complexType>
  </xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:5)

你应该看看Deriving DataSet Relational Structure from XML Schema (XSD)。本文指出

  

通常,对于架构元素的每个 complexType子元素,a   DataSet中生成。表结构已确定   通过复杂类型的定义。

     

...

     

但是,仅为顶级complexType元素创建表   当 complexType元素嵌套在另一个complexType 中时   element,在这种情况下,嵌套的complexType元素被映射到a   DataSet中的 DataTable

所以基本上在这种情况下ReadXML(...) 将创建两个表

  1. 顺序
  2. 项目
  3. 由于项目complexType 嵌套在Order complexType 中,这两个表之间的关系也将生成。为了能够创建此关系,将包含新列Order_id

    修改

    进一步了解Generating DataSet Relations for XSD。在本文中,您将找到:

      

    msdata:关系注释允许您明确指定   模式中元素之间的父子关系不是   嵌套。以下示例显示了Relationship的结构   元件。

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
      <xs:element name="Order">
         ... your definition goes here!
     </xs:element>
     <xs:annotation>
       <xs:appinfo>
         <msdata:Relationship name="OrderItemRelation"
          msdata:parent="Order"
          msdata:child="Item" 
          msdata:parentkey="OrderID"
          msdata:childkey="ANY_COLUMN_IN_NESTED_COMPLEX_TYPE"/>
       </xs:appinfo>
      </xs:annotation>
    </xs:schema>
    

    因此,您可以修改将使用的列以引用内部到外部的complexType,但无法阻止此功能