0

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

信息

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>

如何进行这种映射,它们在同一张表中?

非常感谢你

4

2 回答 2

1

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

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

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

我已经尝试过了,但它给了我主集合中的所有消息和所有答案。

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

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

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

您在场景中遇到的一个潜在问题是ParentId可能NULL在数据库中。这在映射一对多时给 NHibernate 带来了问题。

尝试使关联双向(文档参考)。这有时有助于避免一些陷阱。

为此,请将其添加到您的课程中

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 可以为空。

在您的代码中,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);
}

希望这可以帮助。

于 2009-02-16T15:12:16.370 回答
0

你想映射一棵树吗?也许这会有所帮助: 如何在 nhibernate 中映射树

于 2009-02-16T15:28:39.047 回答