ISession.Merge() を使用して 2 つのセッション間の一貫性を維持しようとしましたが、マージされたインスタンスの Version プロパティがセッションで読み込まれたものよりも高い場合 (StaleObjectStateException を使用)、失敗します。
バージョン フィールドが一致しない場合に機能する代替方法はありますか?
ISession.Merge() を使用して 2 つのセッション間の一貫性を維持しようとしましたが、マージされたインスタンスの Version プロパティがセッションで読み込まれたものよりも高い場合 (StaleObjectStateException を使用)、失敗します。
バージョン フィールドが一致しない場合に機能する代替方法はありますか?
少なくとも楽観的ロックでは、セッション間でエンティティを安全にマージする方法はないようです。
別のパターンを使用します。各セッションには各エンティティの独自のコピーがあり、refresh()
必要に応じて各セッションにインスタンスがあります。これにより、メモリ使用量と DB へのラウンドトリップのオーバーヘッドが追加されましたが、機能しているようです。
電話してみてください:
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 と同様ですが、バージョン管理されたエンティティの場合、バージョンが強制的にインクリメントされます。