1

ISession.Merge() を使用して 2 つのセッション間の一貫性を維持しようとしましたが、マージされたインスタンスの Version プロパティがセッションで読み込まれたものよりも高い場合 (StaleObjectStateException を使用)、失敗します。

バージョン フィールドが一致しない場合に機能する代替方法はありますか?

4

2 に答える 2

0

少なくとも楽観的ロックでは、セッション間でエンティティを安全にマージする方法はないようです。

別のパターンを使用します。各セッションには各エンティティの独自のコピーがあり、refresh()必要に応じて各セッションにインスタンスがあります。これにより、メモリ使用量と DB へのラウンドトリップのオーバーヘッドが追加されましたが、機能しているようです。

于 2011-08-08T13:30:45.280 に答える
0

電話してみてください:

Session.Lock(string entityName, object obj, LockMode lockMode);

LockMode.Force で。その方法についてのコメントは次のように述べています。

これは、バージョン チェック (NHibernate.LockMode.Read) の実行、ペシミスティック ロックへのアップグレード (NHibernate.LockMode.Upgrade)、または一時的なインスタンスとセッションの単純な再関連付け (NHibernate.LockMode.None) に使用できます。関連付けが cascade="lock" でマップされている場合、この操作は関連付けられたインスタンスにカスケードされます。

LockMode.Force の場合:

NHibernate.LockMode.Upgrade と同様ですが、バージョン管理されたエンティティの場合、バージョンが強制的にインクリメントされます。

于 2011-07-27T20:22:52.327 に答える