2009-09-03 13 views
1

Entity Frameworkを実行した後、Entity Frameworkでの監査の実装に関する2つの質問があります。Entity Frameworkでの監査

作成または更新された各列の値を別の監査テーブルに保存します。

  1. 私は現在、SaveChanges(false)を呼び出してDBにレコードを保存しています(ただし、コンテキストの変更はリセットされません)。その後、追加された|変更されたレコードを取得し、GetObjectStateEntriesをループします。しかし、値がストアドプロシージャによって満たされている列の値を取得する方法を知らないでください。すなわち、作成、変更された日付など。

  2. 以下は、私が取り組んでいるサンプルコードです。

  3. は、データ・ベースでそれをやってC#コード
  4. でそれを行う

    • は、データベースレベルでそれを実行します。ここでは

      // Get the changed entires(ie, records) 
      IEnumerable<ObjectStateEntry> changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 
      
      // Iterate each ObjectStateEntry(for each record in the update/modified collection) 
      foreach (ObjectStateEntry entry in changes) 
      { 
          // Iterate the columns in each record and get thier old and new value respectively 
          foreach (var columnName in entry.GetModifiedProperties()) 
          { 
           string oldValue = entry.OriginalValues[columnName].ToString(); 
           string newValue = entry.CurrentValues[columnName].ToString(); 
      
           // Do Some Auditing by sending entityname, columnname, oldvalue, newvalue 
          } 
      } 
      
      changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added); 
      
      foreach (ObjectStateEntry entry in changes) 
      { 
          if (entry.IsRelationship) continue; 
          var columnNames = (from p in entry.EntitySet.ElementType.Members 
               select p.Name).ToList(); 
      
          foreach (var columnName in columnNames) 
          { 
           string newValue = entry.CurrentValues[columnName].ToString(); 
      
           // Do Some Auditing by sending entityname, columnname, value 
          } 
      } 
      
+0

それはあなたがあなたのことを何をしたいのか、あなたが正確に何をすべきかhere-を探しているのは非常に明確ではありません –

+0

私は監査を行いたい(特定のエンティティに対して変更が行われたときに監査テーブルにtablename/entityname、columnname、valueを挿入する) –

答えて

1

次の2つの基本的なオプションを持っていますトリガーを使用することを意味します。その場合、エンタープライズライブラリまたは別のデータアクセステクノロジを使用している場合は違いはありません。

これをC#コードで行うには、データテーブルにログテーブルを追加し、その変更をログテーブルに書き込みます。変更を保存すると、データの変更とログテーブルに書き込んだ情報の両方が保存されます。

0

ストアドプロシージャを使用して新しいレコードを挿入していますか?そうでない場合(つまり、オブジェクトを新規作成し、値を設定し、送信時に挿入して変更を保存すると、新しいオブジェクトIDが作成したオブジェクトのidプロパティに自動的に読み込まれます)あなたは戻り値としてPROCから@@ IDENTITYを返す必要が

EX:。

StoreDateContext db = new StoreDataContext(connString); 
Product p = new Product(); 
p.Name = "Hello Kitty Back Scratcher"; 
p.CategoryId = 5; 
db.Products.Add(p); 
try 
{ 
    db.SaveChanges(); 
    //p.Id is now set 
    return p.Id; 
} 
finally 
{ 
    db.Dispose; 
}