2017-12-01 15 views
1

Entity Frameworkを使用して監査証跡を作成する例をたくさん見てきましたが、私にとっては何かを見つけることはまだありません。 DB ContextのSaveChangesを単純にオーバーライドし、ChangeTracker ...問題を使用すると、IDを持たないエンティティを追加する(作成する)などの作業が必要になります。あなたはそれを保存し、それを保存すると、変更トラッカーに何が入っているかがわかるようになります。とにかく、私は監査証跡が働いていますが、それは地獄のように醜いです。私はこれを単純化し、エンティティを追加するたびに恐ろしい場合に追加する必要がないように助けを求めていました!すべてのヘルプが感謝しています。エンティティフレームワークを使用して監査証跡を作成する方が良い

public bool CreateRecord(object o) 
    { 
     Audit audit = new Audit() 
     { 
      ChangeTypeID = (int)Audit.ChangeType.CREATE, 
      TimeStamp = GetCurrentDateTime(), 
      RecordClass = o.GetType().ToString(), 
      NewValue = "", 
      ReasonForChange = "Record Creation" 
     }; 

     if (o.GetType() == typeof(Permission)) 
     { 
      Permission x = (Permission)o; 
      audit.OriginalValue = x.ToString(); 
      Permissions.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else if (o.GetType() == typeof(User)) 
     { 
      User x = (User)o; 
      audit.OriginalValue = x.ToString(); 
      Users.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else if (o.GetType() == typeof(LogIn)) 
     { 
      LogIn x = (LogIn)o; 
      audit.OriginalValue = x.ToString(); 
      LogIns.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else if (o.GetType() == typeof(Marker)) 
     { 
      Marker x = (Marker)o; 
      audit.OriginalValue = x.ToString(); 
      Markers.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else if (o.GetType() == typeof(Method)) 
     { 
      Method x = (Method)o; 
      audit.OriginalValue = x.ToString(); 
      Methods.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else if (o.GetType() == typeof(Sample)) 
     { 
      Sample x = (Sample)o; 
      audit.OriginalValue = x.ToString(); 
      Samples.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else if (o.GetType() == typeof(Run)) 
     { 
      Run x = (Run)o; 
      audit.OriginalValue = x.ToString(); 
      Runs.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else if (o.GetType() == typeof(XYDataSet)) 
     { 
      XYDataSet x = (XYDataSet)o; 
      audit.OriginalValue = x.ToString(); 
      XYDataSets.Add(x); 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else 
     { 
      return false; 
     } 

     // Save audit record 
     audit.UserID = ((App)Application.Current).GetCurrentUserID(); 
     Audits.Add(audit); 
     SaveChanges(); 

     return true; 
    } 
+0

より汎用的なものについて、あなたは、その[EntityFramework拡張子]と[ 'Audit.NET'](https://github.com/thepirat000/Audit.NET#auditnet)試みることができる(https://でgithubの.com/thepirat000/Audit.NET/blob/master/src/Audit.EntityFramework/README.md#auditentityframework)。 – thepirat000

答えて

0

私は、エンティティのすべてが同じプロジェクト/アセンブリに属していると仮定していますので、あなたはそのような何かを試してみて、このコードは変更が必要になることがあります、テストされていないことに気付くことができます。

public bool CreateRecord(object o) 
    { 
     Audit audit = new Audit() 
     { 
      ChangeTypeID = (int)Audit.ChangeType.CREATE, 
      TimeStamp = GetCurrentDateTime(), 
      RecordClass = o.GetType().ToString(), 
      NewValue = "", 
      ReasonForChange = "Record Creation" 
     }; 
     var entityType = Assembly.GetAssembly(typeof(Permission)).GetTypes().Where(x => x == o.GetType()) 
      .FirstOrDefault(); // Determine the desired entity (assumed all of the entities belongs to same project/assembly) 
     if (entityType != null) 
     { 
      var convertedObject = Convert.ChangeType(o, entityType); // Convert object to entity 
      audit.OriginalValue = convertedObject.ToString(); 
      var entity = yourContext.Set(entityType).Add(convertedObject); // Get DbSet for casted entity 
      SaveChanges(); 
      audit.RecordID = x.ID; 
     } 
     else 
     { 
      return false; 
     } 

     // Save audit record 
     audit.UserID = ((App)Application.Current).GetCurrentUserID(); 
     Audits.Add(audit); 
     SaveChanges(); 

     return true; 
    } 
+0

ありがとう、非常に!それは私にその道の90%を与えました。唯一の問題は、各エンティティでIDの主キーがあることです。上のコードでは、私の残った(今宣言されていない)x変数 "audit.RecordID = x.ID"を残しました。基本的には、エンティティのタイプと主キーIDを保存して、監査証跡から任意のエンティティに戻すことができます。だから私の追随する質問は、変換されたオブジェクトからIDを引き出す方法です。 (もう一度、あなたの助けのためにsooooたくさんありがとう!!!) –

+0

ようこそ。このようにしてみませんか? "var id = entityType.GetProperty(" ID ")。GetValue(convertedObject、null);" – lucky

関連する問題