0

エンティティを取得したら、そのプロパティを変更します。次に、同じエンティティを取得します。

Nhibernate がエンティティをロードする前にエンティティを更新することをどのように言えばよいでしょうか?

ここにコード:

EmployeeRepository employeeRepository = new EmployeeRepository();
Employee employee = employeeRepository.GetById(4);
employee.LastName = "TEST!!!";
Employee employee2 = employeeRepository.GetById(4);

現在、Nhibernate は私のプログラムで更新を行いません。FlushMode を Auto に設定するだけで、エンティティが自動的に更新されると思いました。

編集 背景は、この動作を別のアプリケーションで再現しようとすることです。保存方法はありません!このコードだけです。NHibernate のバージョンは非常に古く、バージョン 1.2.1.4000 です。多分キャッチがあります。

ブラウンフィールド アプリケーションで FlushMode を Commit に設定すると、更新ステートメントが生成されません。

しかし、私自身のプロジェクトでは、この「自動」動作をまだ再現できません。

4

2 に答える 2

3

employeeRepository への両方の呼び出しは、最終的に同じ NHibernateISessionインスタンスを使用していますか? その場合、それらは同じオブジェクトを返し、更新されたLastName値が反映されます。ISessionそうでない場合は、自動フラッシュを利用するために毎回インスタンスを破棄していることを確認する必要があります。

于 2010-07-19T13:27:00.883 に答える
1

AutoのデフォルトのFlushModeのドキュメントによると:

ISessionは、クエリが古い状態を返さないようにするために、クエリの実行前にフラッシュされることがあります。これはデフォルトのフラッシュモードです。

したがって、オブジェクトを再度読み取る前に、セッションを手動でフラッシュして、変更が保持されていることを確認する必要があります。

EmployeeRepository employeeRepository = new EmployeeRepository();
Employee employee = employeeRepository.GetById(4);
employee.LastName = "TEST!!!";
session.Flush();
Employee employee2 = employeeRepository.GetById(4);

リポジトリが両方の呼び出しに同じISessionを使用している場合(imoのように)、従業員4がキャッシュから取得され、変更が加えられます。ただし、変更はまだデータベースに保持されていません。

リポジトリのGetByIdメソッドが呼び出しごとに新しいセッションを使用する場合、リポジトリは常にデータベースにアクセスして従業員を取得します。メソッドでセッションを破棄する場合、オブジェクトはセッションから切り離されたものとして返されます。この戦略はNHibernateの目的を打ち破り、それを単純なデータアクセスツールに委ねます。

于 2010-07-19T13:51:38.363 に答える