NHibernate - проблема отображения наследования с таблицей для стратегии подкласса - PullRequest
0 голосов
/ 02 марта 2011

мы изменили отображение из таблицы для каждого конкретного класса на стратегию подкласса, и теперь UnitTests не работают, но я не могу понять, почему.

Существует один базовый класс Article и дочерний элемент SemifinishedArticle без особых свойств.

Article.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

   <class name="Article" table="cvm_anagrafica_articoli" lazy="true" dynamic-insert="true" dynamic-update="true">



      <id name="Id" column="id" type="integer">
         <generator class="native" >
            <param name="sequence">seq_anagrafica_articoli</param>
         </generator>
      </id>

      <version name="Version" column="versione" unsaved-value="0"/>

      <property name="Code" column="codice" />
      <property name="Description" column="descrizione" />

      <discriminator column="ArticleType" type="string"/>

      <subclass name="SemifinishedArticle" discriminator-value="S" />
   </class>
</hibernate-mapping>

ПолуфабрикатArh.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

    <subclass name="SemifinishedArticle" extends="Article" lazy="true" >


    </subclass>
</hibernate-mapping>

SemifinishedArticle.cs

Public Class SemifinishedArticle
    Inherits Article

End Class

Сообщение об ошибке:

Initialization method CVM050__Recipe_Management_Test.ArticleMappingTest.MyTestInitialize threw exception. NHibernate.MappingException: NHibernate.MappingException: Coveme.Core.Article.hbm.xml(52,4): XML validation error: The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has invalid child element 'discriminator' in namespace 'urn:nhibernate-mapping-2.2'. List of possible elements expected: 'property, many-to-one, one-to-one, component, dynamic-component, properties, any, map, set, list, bag, idbag, array, primitive-array, join, subclass, joined-subclass, union-subclass, loader, sql-insert, sql-update, sql-delete, filter, resultset, query, sql-query' in namespace 'urn:nhibernate-mapping-2.2'. ---> System.Xml.Schema.XmlSchemaValidationException: The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has invalid child element 'discriminator' in namespace 'urn:nhibernate-mapping-2.2'. List of possible elements expected: 'property, many-to-one, one-to-one, component, dynamic-component, properties, any, map, set, list, bag, idbag, array, primitive-array, join, subclass, joined-subclass, union-subclass, loader, sql-insert, sql-update, sql-delete, filter, resultset, query, sql-query' in namespace 'urn:nhibernate-mapping-2.2'..

Трассировка стека ошибок:

NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) in d:\CSharp\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs: line 340
NHibernate.Cfg.Configuration.ValidationHandler(Object o, ValidationEventArgs args) in d:\CSharp\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs: line 1838
System.Xml.Schema.XmlSchemaValidator.SendValidationEvent(ValidationEventHandler eventHandler, Object sender, XmlSchemaValidationException e, XmlSeverityType severity)
System.Xml.Schema.XmlSchemaValidator.ElementValidationError(XmlQualifiedName name, ValidationState context, ValidationEventHandler eventHandler, Object sender, String sourceUri, Int32 lineNo, Int32 linePos, XmlSchemaSet schemaSet)
System.Xml.Schema.XmlSchemaValidator.ValidateElementContext(XmlQualifiedName elementName, Boolean& invalidElementInContext)
System.Xml.Schema.XmlSchemaValidator.ValidateElement(String localName, String namespaceUri, XmlSchemaInfo schemaInfo, String xsiType, String xsiNil, String xsiSchemaLocation, String xsiNoNamespaceSchemaLocation)
System.Xml.XsdValidatingReader.ProcessElementEvent()
System.Xml.XsdValidatingReader.ProcessReaderEvent()
System.Xml.XsdValidatingReader.Read()
System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
System.Xml.XmlDocument.Load(XmlReader reader)
NHibernate.Cfg.Configuration.LoadMappingDocument(XmlReader hbmReader, String name) in d:\CSharp\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs: line 1776
NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name) in d:\CSharp\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs: line 1813
NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name) in d:\CSharp\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs: line 628
NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly) in d:\CSharp\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs: line 666
NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly) in d:\CSharp\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs: line 761
CVM050__Recipe_Management_Test.DbTestsBase`1.Init(Assembly[] assembliesWithMappings) in C:\UsersData\jcocchi\CVM050 - Recipe Management\Trunk\src\CVM050 -Recipe Management Test\DBTestsBase.cs: line 44
CVM050__Recipe_Management_Test.ArticleMappingTest.MyTestInitialize() in C:\UsersData\jcocchi\CVM050 - Recipe Management\Trunk\src\CVM050 -Recipe Management Test\ArticleMappingTest.cs: line 58

Спасибо, ребята

Ответы [ 2 ]

3 голосов
/ 02 марта 2011
  1. SemifinishedArticle.hbm.xml является избыточным (он уже определен вместе со статьей)
  2. <discriminator> идет между <id> и <version>.Порядок важен в схеме NH.

В любом случае, вы создаете себе проблемы, имея класс SemifinishedArticle: Что вы собираетесь делать, когда он будет закончен?Удалить его и вставить статью?Помните, что вы не можете изменить класс объекта.

Лучше добавить свойство ArticleState.

1 голос
/ 02 марта 2011

В article.hbm.xml почему у вас?

<subclass name="SemifinishedArticle" discriminator-value="S" />

Это должно быть в SemifinishedArticle.hbm.xml

...