2009-02-16 17 views
0

Je suis en train de construire un système de messagerie et pour cela j'ai la définition de tableau ci-dessousComment mapper des éléments dont ses sous-éléments sont dans la même table avec Nhibernate?

message

Id 
From 
To 
Body 
ParentId // Subcollection, i want to get Asnwers (Message.ParentId== Message.Id) 
IsRead 

et j'ai cela dans les Message.cs

IList<Message> Answers; 

J'ai essayé ceci mais il me donne tous les messages et toutes les réponses dans la collection principale.

Mais je ne veux pas que les réponses soient vues comme un message (comme l'élément principal).

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="RealEstate.Core" namespace="RealEstate.Core.Domain"> 
    <class name="Message" table="Message" lazy="true"> 
    <id column="id" type="Int64" name="Id"> 
     <generator class="native" /> 
    </id> 
    <property name="From" column="[From]" type="Int64" /> 
    <property name="To" column="[To]" type="Int64" /> 
    <property name="Body" column="Body" /> 
    <property name="ParentId" column="ParentId" type="Int64" /> 
    <property name="SenderType" column="SenderType" type="Byte" /> 
    <property name="IsRead" column="IsRead" type="Boolean" /> 

    <bag name="Answers" lazy="true" cascade="delete"> 
     <key column="ParentId" /> 
     <one-to-many class="Message"/> 
    </bag> 

    </class> 
</hibernate-mapping> 

Comment cette cartographie peut être fait, ils sont dans la même table?

Merci beaucoup

Répondre

1

Avant de tenter une réponse, je vous recommande fortement que vous la recherche NHibernate Users Group comme il y a des tonnes de gens qui se cachent utiles NHibernate répondre là toutes sortes de questions.

Mais laissez-moi voir si je peux aider ici.

Hmmm, je ne suis pas totalement sûr de comprendre la question. Vous dites:

J'ai essayé mais il me donne tous les messages et toutes les réponses à la collection principale.

Mais je ne veux pas que les réponses soient vues comme un message (comme l'élément principal).

Voulez-vous dire que la collection Answers contient toutes les réponses dans la base de données?

Pouvez-vous poster plus de code, montrant la requête que vous exécutez, et le code de la classe?

Un problème potentiel que vous avez avec votre scénario est que ParentId peut être NULL dans la base de données. Cela donne des problèmes NHibernate lors de la cartographie un-à-plusieurs.

Essayez de créer l'association bidirectional (documentation reference). Cela permet parfois d'éviter quelques pièges.

Pour ce faire, ajoutez à votre classe

public class Message { 
    ///<summary>Reference to parent message</summary> 
    public Message Parent {get;set;} 

    //... rest of class 

Ajouter ceci à votre application:

<bag name="Answers" lazy="true" cascade="delete" inverse="true"> 
    <key column="ParentId" /> 
    <one-to-many class="Message"/> 
</bag> 

<many-to-one name="Parent"/> 

Le inverse=true fera NHibernate gérer la relation de la propriété des parents, et non la collection. Ceci est nécessaire car ParentId peut être nul.

Dans votre code, plutôt que d'utiliser myMessage.Answers.Add(blah);, vous pouvez utiliser answer.Parent = myMessage. Bien sûr, vous pouvez écrire de belles méthodes d'aide pour rendre cela plus significatif.

someMessage.AddAnswer(someAnswer); 

Ce qui ressemble à ceci:

public void AddAnswer(Message answer) 
{ 
    answer.Parent = this; 
    if(! this.Answers.Contains(answer)) 
     this.Answers.Add(answer); 
} 

Hope this helps.

+0

Merci beaucoup pour votre aide, mais c'est exactement ce que im la recherche de http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/05/14/how-to -map-a-tree-in-nhibernate.aspx merci encore –