Инструмент или способ создания DataSet.XSD из файла Mapping C # .cs или файла NHibernate.hbm.xml? - PullRequest
0 голосов
/ 17 января 2012

Мне нужно создать файл DataSet.xsd в соответствии с файлом NHibernate.hbm.xml или файлом класса. Это файлы Mapping и файлы классов, которые мы используем для работы с нашей БД.

Вы можете спросить меня, зачем мне нужен файл 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;
    }
}

Я знаю, что это очень специфический случай, но если вы покажете нам хотя бы какой-то способ, это очень поможет.

С уважением,

Густаво

Edit:

Нашел способ сделать это: используя XSD.EXE, внутренний инструмент из Visual Studio, я извлек отображение из моей сборки:

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

Но теперь, когда я делаю это:

D:\>xsd /c schema0.xsd

Результаты в этих ошибках:

D: \ Temp> xsd / c schema0.xsd Утилита поддержки Microsoft (R) Xml Schemas / DataTypes [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 Ответ

1 голос
/ 18 января 2012

Вам не хватает XSD-файла.

ОБНОВЛЕНИЕ: предположим, что вы остановились на xsd.exe. В этом случае измените оператор импорта следующим образом (я называю этот файл 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.

...