Repository.Save を呼び出すと、リポジトリが保持するセッションに通知して、そのオブジェクトを追跡し、次のフラッシュでデータベースへの変更を同期します。セッションをフラッシュするまで、データベースは変更されません。ただし、オブジェクトはセッション キャッシュの一部になるため、Get(1) によって返されます。
クエリを実行してコレクションにデータを入力すると、セッションはデータベースにクエリを実行して結果を取得します (結果がキャッシュされていない場合)。データベースをまだ更新していないため、セッションに追加した車は結果セットに含まれません。(<-- 間違っている可能性があります) ドキュメントを正しく読んでいれば、クエリ結果と Save() されたエンティティの両方をセッション (第 1 レベル) キャッシュに追加する必要があります。これは、DB の結果を追加した後にキャッシュをクエリすることを必ずしも意味するわけではありませんquerystatement.List()
...何が起こっているのかを正確に把握するのに苦労しています。
余談ですが、セッションを自動フラッシュに設定できると思いますが、ドキュメントを確認する必要があります。
アップデート:
ここで何が起こっているのかわかるかもしれないと思います。デフォルトのセッションFlushMode
は ですAuto
が、Rhinoは に設定されUnitOfWork.Start()
たセッションを作成します。これは、トランザクションを明示的に呼び出すかコミットしない限り、セッションが自動フラッシュされないことを意味します。of を使用すると、NHibernate は (場合によっては?) 古いデータが返されるのを防ぐためにクエリを実行する前にセッションをフラッシュします。私が正しければ、DB トランザクションは次のようになります。FlushMode
Commit
Flush()
FlushMode
Auto
SELECT * FROM Car
INSERT INTO Car (...) VALUES (...)
自動フラッシュは、私が読んだドキュメント/ブログから少しあいまいに思えます...最も一般的な答えは、古いデータを決して返さないことをFlushMode = Auto
保証しますが、「時々」フラッシュするということです。Session.Find
NHibernate Linq は実際には Criteria クエリを作成するだけなので、自動フラッシュをトリガーしない可能性があります (おそらくこれは現在修正されています... 知るのは難しいです)。
したがって、あなたの場合、保存の結果をすぐに取得したいので、保存後にフラッシュしたいようです。エンティティのみを更新する小規模な作業単位では、単一の Commit() で十分です。うまくいくかもしれUnitOfWork.CurrentSession.FlushMode = FlushMode.Auto;
ませんが、UOW Factory が明示的にモードを Commit に設定しているという事実は、UOW の境界について真剣に考えることを奨励しているようです。