3

規制目的で完全な監査証跡を必要とするデータベースバックエンドを備えたASP.NETMVCWebアプリを設計しています。

私は過去に監査証跡を実装しましたが、このための組み込み機能を備えたORMツールを使用する方が安全だと感じています。NHibernateが1つの方法のようですが、他のオプションをお勧めしますか?

明確にするために-私は討論やORMの比較には興味がありません。私は、どのORMツールに監査証跡のサポートが組み込まれているのかを効果的に尋ねています。

4

1 に答える 1

1

すべての完全な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);
     }
于 2012-10-17T12:33:33.287 に答える