如何映射其SubItems与Nhibernate在同一个表中的项目?

时间:2009-02-16 13:43:10

标签: 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;

我试过这个,但它给了我主要收藏中的所有信息和所有答案。

但我不希望答案被看作是一条消息(如主要项目)。

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

如何完成此映射,它们位于同一个表中?

非常感谢

2 个答案:

答案 0 :(得分:1)

在尝试回答之前,我强烈建议您搜索NHibernate Users Group ,因为有大量有用的NHibernate人员潜伏在那里回答各种问题。

但是让我看看我是否可以在这里提供帮助。

嗯,我不完全确定我理解这个问题。你说:

  

我试过这个,但它给了我所有   消息和所有答案   主要系列。

     

但我不希望看到答案   像一条消息(如主要项目)。

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

您可以发布更多代码,显示正在运行的查询以及类代码吗?

您的方案存在的一个潜在问题是ParentId可能是数据库中的NULL。这在映射一对多时会给出NHibernate问题。

尝试建立关联bidirectional (documentation reference)。这有时可以避免一些陷阱。

为此,请将其添加到您的班级

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

  //... rest of class

将此添加到您的映射中:

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

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

inverse=true将使NHibernate管理来自Parent属性的关系,而不是集合。这是必要的,因为ParentId可以为null。

在您的代码中,您可以使用myMessage.Answers.Add( blah );而不是answer.Parent = myMessage。当然,你可以编写好的辅助方法来使它更有意义。

someMessage.AddAnswer( someAnswer );

看起来像这样:

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

希望这有帮助。

答案 1 :(得分:0)

你想要映射树吗? 也许这可以帮助: how to map a tree in nhibernate