我正在尝试构建一个消息传递系统,为此我有下面的表定义
消息
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>
如何完成此映射,它们位于同一个表中?
非常感谢
答案 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