3

流暢なNHibernateを使用して、を使用してマップされたクラスのプロパティがありますVersion

Version(x => x.Version);

オブジェクトを保存すると、予想どおりにVersionプロパティがデータベースに増分されますが、オブジェクトのプロパティの値は時々変更されるだけのようです。

using (var tx = session.BeginTransaction())
{
    session.Merge(item);
    tx.Commit();

    item.Version;  // Sometimes this is still 1, when I expect it to be 2.
}

問題は、それが1のままで、さらに変更を加えて再度保存すると、StaleObjectStateExceptionが発生することです。

奇妙なことに、正常に動作し、item.Version値が正しくインクリメントされることがありますが、そうでない場合とそうでない場合の違いがわかりません。

検索してみましたが、これに関するドキュメントが見つからないようです。NHibernatesが期待する動作がバージョンマッピングで何であるかを誰かが説明できますか?

[NHibernateバージョン2.1.2]

4

3 に答える 3

2

ISession.Mergeドキュメントから:

指定されたオブジェクトの状態を、同じ識別子を持つ永続オブジェクトにコピーします。現在セッションに関連付けられている永続インスタンスがない場合は、ロードされます。永続インスタンスを返します。指定されたインスタンスが保存されていない場合は、のコピーを保存して、新しく永続化されたインスタンスとして返します。指定されたインスタンスはセッションに関連付けられません。

したがって、変更されませんitem

(私は自分のアプリで使用したことがないことを付け加えるかもしれMergeません。アタッチされたエンティティとデタッチされたエンティティをどのように扱っているかを確認することをお勧めします)

于 2011-06-10T14:50:51.093 に答える
1

試しましたか

item = session.Merge(item);
tx.Commit();

于 2011-06-10T15:13:03.947 に答える
0

更新されたバージョンがエンティティに伝播する前に、セッションをフラッシュする必要があります。セッションをフラッシュしない限り、エンティティを自分で最新の状態に保つ責任はあなたにあります。

通常、セッションが閉じられたときに、セッションを自動的にフラッシュする必要があります。ただし、エンティティ自体に対して行った設定ではなく、nhibernateを介して行われるデータベースの更新に依存している場合は、コミット後に自分でセッションをフラッシュする必要があります。この場合、セッションをフラッシュすると、ダーティなエンティティがコミットされることに注意してください。これは望ましくない場合があるため、スコープが非常に制限されていることを確認してください。

于 2011-06-10T14:17:54.820 に答える