Asp.net 如何映射其子项与Nhibernate位于同一表中的项?

Asp.net 如何映射其子项与Nhibernate位于同一表中的项?,asp.net,nhibernate,nhibernate-mapping,mapping,Asp.net,Nhibernate,Nhibernate Mapping,Mapping,我正在尝试构建一个消息传递系统,为此,我有下面的表定义 信息 Id From To Body ParentId // Subcollection, i want to get Asnwers (Message.ParentId== Message.Id) IsRead 我在Message.cs中有这个 IList<Message> Answers; IList答案; 我尝试过这个,但它给了我所有的信息和所有的答案,在主要收集 但我不希望答案被视为一条信息(如主要内容)。 <

我正在尝试构建一个消息传递系统,为此,我有下面的表定义

信息

Id
From
To
Body
ParentId // Subcollection, i want to get Asnwers (Message.ParentId== Message.Id)
IsRead
我在Message.cs中有这个

IList<Message> Answers;
IList答案;
我尝试过这个,但它给了我所有的信息和所有的答案,在主要收集

但我不希望答案被视为一条信息(如主要内容)。

<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>

如果它们在同一个表中,如何进行映射


非常感谢您

在尝试回答之前,我强烈建议您搜索,因为那里潜伏着大量帮助NHibernate的人,他们回答各种问题

但让我看看我能不能帮上忙

嗯,我不太确定我是否理解这个问题。你说:

我试过这个,但它给了我一切 信息和所有答案在 主要收藏

但我不想让人看到答案 像一条消息(像主项)

您的意思是
答案
集合包含数据库中的所有答案吗

你能发布更多的代码,显示你正在运行的查询和类代码吗

场景中的一个潜在问题是数据库中的
ParentId
可能是
NULL
。这会在映射一对多时产生NHibernate问题

试着建立联系。这有时有助于避免一些陷阱

要做到这一点,请将此添加到您的类中

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

  //... rest of class
看起来是这样的:

public void AddAnswer(Message answer)
{
   answer.Parent = this;  
   if( ! this.Answers.Contains(answer) )
      this.Answers.Add(answer);
}
希望这有帮助。

你想映射一棵树吗? 也许这会有帮助:

非常感谢您的帮助,但这正是我想要再次感谢的
someMessage.AddAnswer( someAnswer );
public void AddAnswer(Message answer)
{
   answer.Parent = this;  
   if( ! this.Answers.Contains(answer) )
      this.Answers.Add(answer);
}