2010-10-18 14 views
2

J'ai un objet NHibernate qui est une superclasse (appelons-le "Super"), et une sous-classe qui en hérite (disons qu'elle s'appelle "Sub"). J'ai une classe distincte (appelée "Widget") avec une propriété de type Super.Problème de mappage Nhibernate: une propriété dont le type est une superclasse

<class name="Widget" table="Widgets" lazy="true"> 
    <id name="Id" type="System.Int32" column="NoteId"> 
     <generator class="identity" /> 
    </id> 
    <many-to-one name="SuperProperty" column="SuperId" class="SuperClass" /> 
</class> 

Quand j'accéder à superpropriété sur une instance d'un Widget, NHibernate tente de charger paresseusement, mais je reçois cette erreur:

More than one row with the given identifier was found: 1, for class: Super

Il n'y a qu'un seul enregistrement en SuperThings avec un identifiant de 1 et un enregistrement séparé dans SubThings qui lui est associé. Après avoir utilisé NHibernate Profiler et débogué mon code, il semble que NHibernate essaie d'instancier un objet dont le type est la sous-classe.

Pourquoi cela fait-il cela? Y at-il quelque chose qui ne va pas dans la façon dont je pense que cela devrait être cartographié?

De toute évidence, il s'agit d'une version simplifiée de ce que je suis en train de travailler. Les objets avec lesquels je travaille ont beaucoup plus de propriétés de types différents, donc j'ai peut-être omis ce qui cause réellement le problème, mais je voulais m'assurer que je comprenais au moins les choses au niveau de base.

Répondre

2

S'il existe un enregistrement dans SuperThings avec Id = 1 et un enregistrement dans SubThings avec SubId = 1, selon votre mappage, une sous-instance est persistante, donc NHibernate a raison lorsqu'il essaie de l'instancier.

Si ce n'est pas ce que vous vouliez, vous devez relire Chapter 8. Inheritance Mapping pour voir les alternatives.