2010-12-06 2 views
2

Supposons que vous ayez les définitions de classe suivantes:Quelle est la syntaxe XML pour mapper une classe imbriquée dans NHibernate

public class SomeEntity 
{ 
    public class Key 
    { 
     public virtual OtherEntity Other { get; set; } 
     public virtual int Index { get; set; } 

     public override bool Equals(object other) 
     { 
      // something here... 
     } 

     public override int GetHashCode() 
     { 
      // something here... 
     } 
    } 

    public virtual Key Id { get; set; } 
} 

public class OtherEntity 
{ 
    public virtual int Id { get; set; } 
} 

Et alors vous voulez avoir un fichier de mappage similaire à celui ci-dessous:

<class name="SomeEntity" table="SOME"> 

    <composite-id name="Id" class="SomeEntity.Key"> 
    <key-many-to-one name="Other" column="OTHER_ID" class="OtherEntity" /> 
    <key-property name="Index" column="INDEX" type="int" /> 
    </composite-id> 

</class> 

<class name="OtherEntity" table="OTHER"> 

    <id name="Id" column="ID" type="int"> 
    <generator class="identity" /> 
    </id> 

</class> 

La tentative d'initialisation de NHibernate génère un NHibernate.MappingException levé, avec le message "Impossible de trouver la classe: SomeEntity.Key". Le plus probable est le problème avec l'attribut class="SomeEntity.Key". Je n'ai pas pu trouver la syntaxe appropriée pour référencer une classe imbriquée.

Je voudrais aussi avoir un indice où d'autre aurais-je dû chercher la réponse (je n'ai pas trouvé la réponse dans le livre "NHibernate in Action", par exemple). Quelle est votre ressource préférée pour ces questions à propos de NHibernate?

Répondre

5

Vous devez utiliser la syntaxe CLR pour les classes internes:

<composite-id name="Id" class="SomeEntity+Key"> 
... 
+0

Exactement. Nous l'avons donc documenté pour les générations futures;) –

2
public class MainClass 
{ 
    public virtual long MainKey {get; set;} 
    public virtual SubClass SubInstance {get; set;} 

    public class SubClass 
    { 
    public virtual long SubKey {get;set;} 
    } 
} 

peuvent être mis en correspondance comme:

<class name="MainClass" table="Main"> 
    <id name="MainKey" column="MainId" type="Int64"> 
    <generator class="identity" /> 
    </id> 
    <many-to-one name="SubInstance" class="MainClass+SubClass" Column="SubId"/> 
</class> 

<class name="MainClass+SubClass" table="Sub"> 
    <id name="SubKey" column="SubId" type="Int64"> 
    <generator class="identity" /> 
    </id> 
</class> 
Questions connexes