工具或从Mapping C#.cs文件或NHibernate.hbm.xml文件创建DataSet.XSD的方法?

时间:2012-01-17 18:29:53

标签: nhibernate crystal-reports xsd dataset

我需要根据NHibernate.hbm.xml文件或类文件创建DataSet.xsd文件。这些是映射文件和类文件,而不是我们用来处理数据库的文件。

您可能会问我,为什么我需要一个DataSet文件,从Nhibernate.hbm.xml文件或.cs文件生成?

这是因为我们正在使用Crystal Reports,我们正在使用 Frameworks,MVVM,INotifyPropertyChanged,NHibernate ,在大量学习之后,对于我们的情况,如果我们在执行程序时转换对象并使用它来生成报告,那就更好了。如果这个工具存在,它将变得更容易,因为我们的数据库中每个表有超过60,70列。由于我们已经将所有这些组件都用于我们的项目,因此如果我们开始使用sql查询来生成报告就没有意义。

此工具或“创建此DataSet文件的方式”需要以这些格式读取这些文件:

Nhibernate.hbm.xml文件:

<?xml version="1.0" encoding="utf-8" ?>  
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="PCT.Domain" namespace="Gerdau.PCT.Kernel.Domain">
<class name="Furnace" table="Furnace" lazy="false">    
<id name="Id" column="Id_Furnace" type="Int64">
  <generator class="Geraes.GLib.GDomainBasis.CustomTableHiLoGenerator, GLib.GDomainBasis" />
</id>
<property name="Name" column="Name" type="String" length="50" not-null="true"/>
<property name="Code" column="Code" type="Char" not-null="true"/>
<property name="Mill" column="Mill" type="String" length="2" not-null="true"/>
<property name="DischEnabled" column="Disch_Enabled" type="Char" not-null="true"/>
<property name="DischEnabledTemp" column="Disch_Enabled_Temp" type="Char" not-null="true"/>
<property name="ChargeEnabled" column="Charge_Enabled" type="Char" not-null="true"/>
<property name="ChargeEnabledTemp" column="Charge_Enabled_Temp" type="Char" not-null="true"/>    
</class>  
</hibernate-mapping>

CSharp .cs文件:

public class Furnace : BaseEntity
{
    public virtual String Name { get; set; }

    public virtual Char Code { get; set; }

    public virtual String Mill { get; set; }

    public virtual Char DischEnabled { get; set; }

    public virtual Boolean DischEnabledConv
    {
        get
        {
            return DischEnabled.ConvertYesNoToBoolean();
        }
        set
        {
            DischEnabled = ((Boolean)value).ConvertYesNoToBoolean();
        }
    }

    public virtual Boolean DischEnabledTempConv
    {
        get
        {
            return DischEnabledTemp.ConvertYesNoToBoolean();
        }
        set
        {
            DischEnabledTemp = ((Boolean)value).ConvertYesNoToBoolean();
        }
    }

    public virtual Char DischEnabledTemp { get; set; }

    public virtual Char ChargeEnabled { get; set; }

    public virtual Boolean ChargeEnabledConv
    {
        get
        {
            return ChargeEnabled.ConvertYesNoToBoolean();
        }
        set
        {
            ChargeEnabled = ((Boolean)value).ConvertYesNoToBoolean();
        }
    }

    public virtual Boolean ChargeEnabledTempConv
    {
        get
        {
            return ChargeEnabledTemp.ConvertYesNoToBoolean();
        }
        set
        {
            ChargeEnabledTemp = ((Boolean)value).ConvertYesNoToBoolean();
        }
    }
    public virtual Char ChargeEnabledTemp { get; set; }

    public virtual ConfiguracaoForno MillConv
    {
        get
        {
            if (Mill == ConfiguracaoForno.SM.ToString())
                return ConfiguracaoForno.SM;
            if (Mill == ConfiguracaoForno.PM.ToString())
                return ConfiguracaoForno.PM;
            else
                return ConfiguracaoForno.NN;
        }
    }

    public override String ToString()
    {
        return "Forno " + Code + " (" + Name + "): Laminador " + MillConv;
    }
}

我知道这是一个非常具体的案例,但如果你能向我们展示至少一种方式,那将会有很大的帮助。

致以最诚挚的问候,

古斯塔沃

修改

找到了一种方法:使用XSD.EXE,一个来自Visual Studio的内部工具,我从我的程序集中提取了映射:

C:\>xsd / c /l:CS -t:Furnace <MyAssembly>.dll -o:"D:\Temp"

但现在,当我这样做时:

D:\>xsd /c schema0.xsd

导致这些错误:

  

D:\ Temp&gt; xsd / c schema0.xsd   Microsoft(R)Xml架构/数据类型支持实用程序   [Microsoft(R).NET Framework,版本4.0.30319.1]   版权所有(C)Microsoft Corporation。保留所有权利。

     
    

架构验证警告:未声明类型“char”,或者不是简单类型。      第21行,第5位。     架构验证警告:未声明类型“http://microsoft.com/wsdl/types/:char”。第10行,第7位。     架构验证警告:未声明类型“http://microsoft.com/wsdl/types/:char”。第12行,第7位。     架构验证警告:未声明类型“http://microsoft.com/wsdl/types/:char”。第15行,第7位。     架构验证警告:未声明类型“http://microsoft.com/wsdl/types/:char”。第16行,第7位。     架构验证警告:未声明类型“http://microsoft.com/wsdl/types/:char”。第19行,第7位。     警告:无法验证架构。类生成可能会失败或可能产生不正确的结果。

  
     

错误:为架构'schema0'生成类时出错。      - 缺少数据类型“char”。

     

如果您需要更多帮助,请输入“xsd /?".

这是我生成的schema.xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://microsoft.com/wsdl/types/" />
<xs:element name="Furnace" nillable="true" type="Furnace" />
<xs:complexType name="Furnace">
    <xs:complexContent mixed="false">
      <xs:extension base="BaseEntity">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
          <xs:element minOccurs="1" maxOccurs="1" name="Code" xmlns:q1="http://microsoft.com/wsdl/types/" type="q1:char" />
          <xs:element minOccurs="0" maxOccurs="1" name="Mill" type="xs:string" />
          <xs:element minOccurs="1" maxOccurs="1" name="DischEnabled" xmlns:q2="http://microsoft.com/wsdl/types/" type="q2:char" />
          <xs:element minOccurs="1" maxOccurs="1" name="DischEnabledConv" type="xs:boolean" />
          <xs:element minOccurs="1" maxOccurs="1" name="DischEnabledTempConv" type="xs:boolean" />
          <xs:element minOccurs="1" maxOccurs="1" name="DischEnabledTemp" xmlns:q3="http://microsoft.com/wsdl/types/" type="q3:char" />
          <xs:element minOccurs="1" maxOccurs="1" name="ChargeEnabled" xmlns:q4="http://microsoft.com/wsdl/types/" type="q4:char" />
          <xs:element minOccurs="1" maxOccurs="1" name="ChargeEnabledConv" type="xs:boolean" />
          <xs:element minOccurs="1" maxOccurs="1" name="ChargeEnabledTempConv" type="xs:boolean" />
          <xs:element minOccurs="1" maxOccurs="1" name="ChargeEnabledTemp" xmlns:q5="http://microsoft.com/wsdl/types/" type="q5:char" />
        </xs:sequence>
    </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="BaseEntity">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="Id" type="xs:long" />
    </xs:sequence>
</xs:complexType>
</xs:schema>

我感谢任何帮助。

古斯塔沃

1 个答案:

答案 0 :(得分:1)

你错过了一个XSD文件。

更新:我们假设您使用的是xsd.exe。在这种情况下,修改import语句如下(我将此文件称为XSD-1.xsd):

<xs:import namespace="http://microsoft.com/wsdl/types/" schemaLocation="XSD-2.xsd" />

将以下内容复制到XSD-2.xsd文件中,位于同一文件夹中:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://microsoft.com/wsdl/types/" elementFormDefault="qualified" targetNamespace="http://microsoft.com/wsdl/types/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:simpleType name="guid">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="char">
    <xs:restriction base="xs:unsignedShort" />
  </xs:simpleType>
</xs:schema>

使用以下行运行xsd.exe:

xsd XSD-1.xsd /c

您应该获得XSD-1.cs文件和一些警告

如果你想使用svcutil,你必须拥有XSD-2.xsd,否则它将无效;另外,从正面来看,您不必修改XSD-1.xsd:

svcutil XSD-1.xsd XSD-2.xsd /dconly

工作正常,没有任何错误。我正在运行v4。