代码之家  ›  专栏  ›  技术社区  ›  Barbaros Alp

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

  •  0
  • Barbaros Alp  · 技术社区  · 16 年前

    消息

    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 回复  |  直到 16 年前
        1
  •  1
  •   tobinharris    16 年前

    在尝试回答之前,我强烈建议您 搜索 NHibernate Users Group

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

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

    主要收藏。

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

    你是说 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

    在代码中,而不是使用 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);
    }
    

    希望这有帮助。

        2
  •  0
  •   tinonetic    8 年前

    也许这会有帮助: how to map a tree in nhibernate