EDIT:1)同じ行を更新する場合
NHibernate の機能があります。Version
orTimestamp
プロパティとそれを囲む強力な管理機能です。ここを読んでみてください:いつ Nhibernate を使用しますか? 詳細については。エキス
...エンティティ インスタンスには、数値またはタイムスタンプのバージョンがあります。Hibernate は、オブジェクトが変更されるとそのバージョンをインクリメントし、バージョンを自動的に比較し、競合が検出された場合は例外をスローします。したがって、このバージョン プロパティをすべての永続エンティティ クラスに追加して、楽観的ロックを有効にします。... バージョン番号は単なるカウンター値であり、有用なセマンティック値はありません。
NHibernate のドキュメント:
したがって、バージョンを使用すると、次のものが得られます。
- Hibernate はバージョン値を増やします。
- 誰かが古い、古いバージョンの値で行を更新しようとすると、StaleException がスローされます。
- この問題を解決するためにハンドラを追加できます。これはコード次第です。
次に、より多くの標準機能 (インターセプターなど) を使用して、更新時のすべての変更を別のテーブルに監査することができます...現在のバージョン番号を使用します。
概要: NHibernate のバージョン管理システムがすべてを解決するわけではありません。StaleExceptions... が提供され、それらを処理する必要があります。しかし、一度に 1 つのバージョンだけが同じバージョン番号で保存されたことは確かです。
EDIT:2)新しい変更を新しい行として追跡する
私たちのアプローチに基づいて、これを提案として受け取ってください。これが、監査追跡システムとして変更を実装する方法です
IAuditable などのビジネス オブジェクトは次のように定義されます。
public class Article : IAuditable
{
public virtual int ID { get; set; }
public virtual string Text { get; set; }
...
// if possible to move it to base for more Business Objects
// public virtual IList<IHistory> History { get; set; }
public virtual IList<ArticleHistory> History { get; set; }
}
更新があるたびに、記事自体が更新され、新しい ArticleHistory インスタンスが作成されます。その ID に HiLo ジェネレーターを使用すると、Web ファームでも正しく挿入されます。
このアプローチにより、Article の最新のインスタンスを操作し、パフォーマンスを向上させ (履歴は別のテーブルにあります)、AOP をサポートします (AuditAOPFilter を注入することで履歴追跡をオン/オフにします。履歴コレクションをロードする詳細でのみ。
これは提案です。これがあなたのシナリオに合わないことは理解できます(そして質問には答えません)。