2009-03-12 4 views
2

Nous avons besoin de carte classe simple en utilisant NHibernate:connecté Doublement cartographie des arbres commandés à l'aide NHibernate

public class CatalogItem 
{ 
    private IList<CatalogItem> children = new List<CatalogItem>(); 

    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public CatalogItem Parent { get; set; } 
    public IList<CatalogItem> Children 
    { 
     get { return children; } 
    }   
    public bool IsRoot { get { return Parent == null; } }   
    public bool IsLeaf { get { return Children.Count == 0; } } 
} 

Il y a un lot de tutoriels dans Internet à ce sujet, mais aucun d'entre eux couvrent peu de détails méchant: nous avons besoin Afin d'être conservé dans la collection Enfants. Nous avons essayé le mapping suivant, mais cela a conduit à des exeptions étranges lancées par NHibernate ("La méthode non statique requiert une cible.").

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain.Model" assembly="Domain"> 
    <class name="CatalogItem" lazy="false"> 
     <id name="Id" type="guid"> 
      <generator class="guid" /> 
     </id> 
     <property name="Name" /> 

     <many-to-one name="Parent" class="CatalogItem" lazy="false" /> 

     <list name="Children" cascade="all"> 
      <key property-ref="Parent"/> 
      <index column="weight" type="Int32" /> 
      <one-to-many not-found="exception" class="CatalogItem"/> 
     </list>   
    </class> 
</hibernate-mapping> 

Quelqu'un a-t-il des idées?

+0

Lorsque je compile votre code, j'obtiens une erreur disant "Impossible de trouver un setter pour la propriété 'Children' dans la classe 'CatalogItem'". –

Répondre

0

Je ne suis pas un expert, mais <key property-ref=...> me semble étrange dans cette utilisation. Vous devriez être capable de faire <key column="ParentID"/>, et NHibernate utilisera automatiquement la clé primaire de la classe associée - elle-même, dans ce cas.

Vous devrez peut-être également définir la liste sur inverse="true", car la relation est bidirectionnelle. [Voir la section 6.8 dans les docs.]

Questions connexes