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コレクションにはデータベース内のすべての回答が含まれているということですか?

実行中のクエリとクラスコードを示すコードをさらに投稿できますか?

シナリオで発生する可能性のある問題の 1 つは、データベースに存在ParentIdする可能性があることです。NULLこれにより、1 対多をマッピングするときに 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 は 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);
}

お役に立てれば。

于 2009-02-16T15:12:16.370 に答える
0

ツリーをマッピングしますか? 多分これが役立つかもしれません: how to map a tree in hibernate

于 2009-02-16T15:28:39.047 に答える