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

从映射C#.cs文件或NHibernate.hbm.xml文件创建DataSet.XSD的工具或方法?,nhibernate,crystal-reports,xsd,dataset,Nhibernate,Crystal Reports,Xsd,Dataset,我需要根据NHibernate.hbm.xml文件或类文件创建DataSet.xsd文件。这些是映射文件和类文件,而不是我们用来处理数据库的文件 您可能会问我,为什么需要从Nhibernate.hbm.xml文件或.cs文件生成数据集文件 这是因为我们使用的是Crystal Reports,我们使用的是框架、MVVM、INotifyPropertyChanged、NHibernate,在大量研究之后,对于我们的例子来说,如果我们在程序执行时转换对象并使用它生成报告会更好。如果这个工具存在,它将变

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

您可能会问我,为什么需要从Nhibernate.hbm.xml文件或.cs文件生成数据集文件

这是因为我们使用的是Crystal Reports,我们使用的是框架、MVVM、INotifyPropertyChanged、NHibernate,在大量研究之后,对于我们的例子来说,如果我们在程序执行时转换对象并使用它生成报告会更好。如果这个工具存在,它将变得更容易,因为我们的数据库中每个表有60到70列。因为我们已经在项目中使用了所有这些组件,所以如果我们开始使用sql查询来生成报告就没有意义了

此工具或“创建此数据集文件的方法”需要以以下格式读取这些文件:

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>
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;
    }
}
我知道这是一个非常具体的案例,但如果你能至少向我们展示一种方式,那将是非常有帮助的

致以最良好的祝愿

古斯塔沃

编辑:

<?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>
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;
    }
}
找到了一种方法:使用Visual Studio的内部工具XSD.EXE,我从程序集中提取了映射:

C:\>xsd / c /l:CS -t:Furnace <MyAssembly>.dll -o:"D:\Temp"
导致这些错误的原因:

D:\Temp>xsd/c schema0.xsd Microsoft(R)Xml架构/数据类型支持实用程序 [Microsoft(R).NET Framework,版本4.0.30319.1] 版权所有(C)微软公司。版权所有

架构验证警告:未声明类型“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>

谢谢你的帮助


Gustavo

您缺少一个XSD文件

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

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

如果要使用svcutil,必须使用XSD-2.XSD,否则它将无法工作;另外,从好的方面来说,您不必修改XSD-1.XSD:

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

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

您好,我已经做了更改,但仍然会出现这些错误,我也在使用那个XSD文件。使用svcutil.exe进行了尝试,结果是一样的..我刚刚尝试过,使用xsd.exe效果很好;它给出5个警告,但代码生成正常。我将用详细信息更新回复(我将停止发布生成的C#文件)。。。它生成类。问题是当我尝试使用/d参数生成数据集文件时。告诉我:错误:处理“schema0.xsd”时出错为数据集“”生成代码时出错无法将输入xml文件内容转换为数据集。未声明类型“t.com/wsdl/types/:char”。-未声明类型“”。那是因为煤焦问题。该文件生成的结果很好,除了/d参数不能生成DataSetI,我刚刚尝试了xsd-xsd-1.xsd/d,它成功地生成了代码;确保你使用的是我发布的XSD-1.XSD,只有他能工作。将他与我的schema.XSD一起使用不会产生任何效果。使用以下语法:C:\>xsd/cschema.xsd CHAR.xsd CHAR.xsd是您发布的补充文件。
svcutil XSD-1.xsd XSD-2.xsd /dconly