2

私は2つのクラスを持っています

public class Notification
{
    public virtual Guid ID { get; set; }
    public virtual IEnumerable<Message> Messages {get;set;}
}

public class Message
{
    public virtual Guid ID { get; set; }
    public virtual string Message { get; set; }
}

ページに2つの.ascxコントロールがあり、一方はパブリックメソッドを介してもう一方のバインドを呼び出します。ここで、メッセージリストに行を追加してから、IDで通知を取得し、メッセージを返すbindメソッドを実行するとします。新しく追加されたメッセージが表示されません。このデータを取得する前に、ページを再度更新する必要があります。

IEnumerableキャッシングについて何かありますか、またはSession.Get <>を実行しているデータベースに強制的に戻す方法はありますが、希望する効果がありません。

私も試しました

Session.Evict
Session.Refresh

4

1 に答える 1

1

以下に掲載されているQとAを確認してください。彼らのケースはあなたのケースと非常に似ていると思います。たぶん、あなたがあなたのコレクションを扱う方法を単に変えることによって

NHibernateでアソシエーション/関連コレクションをリロードする
nhibernateでエンティティを更新する最良の方法は何ですか
https://forum.hibernate.org/viewtopic.php?f=1&t=968923

主な問題は、NHに「コレクション」の概念がないことです。オブジェクトを処理し、それらをテーブルにマップするだけです。リレーションをたどると、NHはクエリを生成し、オブジェクトのリストをダウンロードし、完了したと見なして満足します。クエリによって返されたオブジェクトのコレクションを取得します。コレクションを再度読み取るには、実際にクエリを再実行する必要があります。これがクエリと基準の目的です。コレクションを更新するために再利用できるものを準備することです。更新-DBからそれらを再フェッチすることによって。

IIRC、NHはオブジェクトを追跡します。これは、クエリの最初の実行でオブジェクトA、B、Cが返され、それらがList <>に入れられた場合、hextの実行でA、C、D、Eが返され、他のList <>に戻された後、オブジェクトAとCは、最初と同じオブジェクトになります。別のNHセッションを使用しない限り、オブジェクトのクローンは作成されません。もちろん、両方のList <>を処理するのはあなた次第です。つまり、ユーザーに表示される1つのものにそれらをマージする方法を決定する必要があります。通常、最初のドロップを削除し、最も新しいものだけを使用して、「B」が削除されたことを即座に示すか、「B」が削除されなかったふりをして、コミット時にサイレントにパッチを適用する両方をマージします。

于 2012-08-15T10:53:48.410 に答える