規制目的で完全な監査証跡を必要とするデータベースバックエンドを備えたASP.NETMVCWebアプリを設計しています。
私は過去に監査証跡を実装しましたが、このための組み込み機能を備えたORMツールを使用する方が安全だと感じています。NHibernateが1つの方法のようですが、他のオプションをお勧めしますか?
明確にするために-私は討論やORMの比較には興味がありません。私は、どのORMツールに監査証跡のサポートが組み込まれているのかを効果的に尋ねています。
規制目的で完全な監査証跡を必要とするデータベースバックエンドを備えたASP.NETMVCWebアプリを設計しています。
私は過去に監査証跡を実装しましたが、このための組み込み機能を備えたORMツールを使用する方が安全だと感じています。NHibernateが1つの方法のようですが、他のオプションをお勧めしますか?
明確にするために-私は討論やORMの比較には興味がありません。私は、どのORMツールに監査証跡のサポートが組み込まれているのかを効果的に尋ねています。
すべての完全なORMで実際のdb操作を傍受できると思います(ただし、通常、dapperのようなマイクロormではできません)。オブジェクトの元の状態と変更された状態を含む、新しいレコード、削除、および変更をキャッチできます。
Newtonsoft を使用してプロパティを StringBuilder にダンプする Linq2SQL の例を次に示します (コードを DataContext クラスに追加します)。
public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
{
var changes = GetChangeSet();
var inserts = changes.Inserts;
var deletes = changes.Deletes;
var updates = changes.Updates;
var sbLog = new StringBuilder();
sbLog.AppendLine("Inserts:");
sbLog.AppendLine(Newtonsoft.Json.JsonConvert.SerializeObject(inserts, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }));
sbLog.AppendLine("Deletes:");
sbLog.AppendLine(Newtonsoft.Json.JsonConvert.SerializeObject(deletes, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }));
sbLog.AppendLine("Updates:");
foreach(object x in updates) {
var original = this.GetTable(x.GetType()).GetOriginalEntityState(x);
sbLog.AppendLine(Newtonsoft.Json.JsonConvert.SerializeObject(new { original = original, mod = x },
Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }));
}
//"logger" can be anything, you use to log the changes...
logger.Info(("db operations:" + Environment.NewLine + sbLog.ToString()).Replace(Environment.NewLine, Environment.NewLine + " | "));
base.SubmitChanges(failureMode);
}