4

シナリオは次のとおりです。

NHibernate を使用した winforms アプリケーションがあります。起動すると、DataGridView に NHibernate クエリの結果が入力されます。この部分は正常に動作します。そのリストのレコードを更新してセッションをフラッシュすると、更新によってデータベースが取り込まれます。更新後にフォームを閉じるときに、メソッドを呼び出してオブジェクトのリストを取得し、DataGridView に再度データを入力して変更を取得し、他のユーザーが行った可能性のあるその他の変更も取得します。問題は、更新されたレコード、NHibernate が提供するリストの変更を反映していないことです。レコードを挿入または削除すると、すべて正常に動作します。この動作が発生するのは、更新したときだけです。キャッシングメカニズムを備えたNHibernateに絞り込みました。更新後にキャッシュを使用する代わりに、NHibernate にデータベースから取得させる方法がわかりません。NHibernate フォーラムに投稿しましたが、彼らからの提案はうまくいきませんでした。私はこれを述べましたが、誰も返事をしませんでした。正しく行わなかった場合に備えて、試したことを述べるつもりはありません。私が正確に試したことで回答した場合は、回答のコメントに記載します。

これは、リストを取得するために使用するコードです。

public IList<WorkOrder> FindBy(string fromDate, string toDate)
{
    IQuery query = _currentSession.CreateQuery("from WorkOrder wo where wo.Date >= ? and wo.Date <= ?");
    query.SetParameter(0, fromDate);
    query.SetParameter(1, toDate);
    return query.List<WorkOrder>();
}

セッションは、構築時にクラスに渡されます。マッピング ファイルも投稿できますが、他のすべてが機能するため、何か問題があるかどうかはわかりません。誰もこれを前に見たことがありますか?これは私が NHibernate を使用した最初のプロジェクトです。助けてくれてありがとう。

4

2 に答える 2

3

更新後、第 1 レベルのキャッシュからオブジェクトを削除します。

Session.Update(obj);
Session.Evict(obj);

最初にコミットおよび/またはフラッシュすることをお勧めします。

于 2008-10-10T15:14:04.473 に答える
0

リフレッシュはどうですか?- 9.2を参照してください。ドキュメントのオブジェクトの読み込み:

"sess.Save(cat); sess.Flush(); //SQL INSERT を強制します sess.Refresh(cat); //状態を再読み込みします (トリガーの実行後)"

于 2008-09-26T12:32:20.750 に答える