2012-11-26 54 views
0

我遇到了下面我的代碼問題。一切工作正常獲得添加和刪除條目。我可以訪問修改部分中的所有新數據,但出於某種原因,我無法獲取原始值。任何幫助將非常感激實體框架審計線索

public override int SaveChanges() 
    { 

     ChangeTracker.DetectChanges(); // Important! 

     ObjectContext ctx = ((IObjectContextAdapter)this).ObjectContext; 

     List<ObjectStateEntry> objectStateEntryList = 
      ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added 
                 | EntityState.Modified 
                 | EntityState.Deleted) 
      .ToList(); 
     List<Log> LogEntries = new List<Log>(); 

     foreach (ObjectStateEntry entry in objectStateEntryList) 
     { 

      if ((!entry.IsRelationship) && (entry.Entity is Scan)) 
      { 
       Log logEntry = new Log(); 
       JavaScriptSerializer serializer= new JavaScriptSerializer(); 
       logEntry.TimeStamp = System.DateTime.Now; 
       logEntry.Username = "me"; 
       IEnumerable<string> modifiedProperties = entry.GetModifiedProperties(); 
       logEntry.ChangedColumns = serializer.Serialize(modifiedProperties); 
       logEntry.TableName = entry.EntitySet.Name; 

       switch (entry.State) 
       { 
        case EntityState.Added: 
         { 

          logEntry.Action = "Added"; 
          logEntry.NewValue = serializer.Serialize(entry.Entity); 
          logEntry.OriginalValue = ""; 

          // write log... 
          break; 
         } 
        case EntityState.Deleted: 
         {// write log... 

          logEntry.Action = "Deleted"; 
          logEntry.NewValue = serializer.Serialize(entry.Entity); 
          logEntry.OriginalValue = ""; 

          break; 
         } 
        case EntityState.Modified: 
         { 
          logEntry.NewValue = "{"; 
          logEntry.OriginalValue = "{"; 
          foreach (string propertyName in 
             entry.GetModifiedProperties()) 
          { 
           DbDataRecord original = entry.OriginalValues; 
           string oldValue = original.GetValue(
            original.GetOrdinal(propertyName)) 
            .ToString(); 

           CurrentValueRecord current = entry.CurrentValues; 
           string newValue = current.GetValue(
            current.GetOrdinal(propertyName)) 
            .ToString(); 
           logEntry.NewValue += "\"" + propertyName + "\":\"" + newValue + "\","; 
           logEntry.OriginalValue += "\"" + propertyName + "\":\"" + oldValue + "\","; 
          } 
          logEntry.NewValue = logEntry.NewValue.TrimEnd(',') + "}"; 
          logEntry.OriginalValue = logEntry.OriginalValue.TrimEnd(',') + "}"; 
          break; 
         } 
       } 
       LogEntries.Add(logEntry); 

      } 
     } 
     foreach (Log addLog in LogEntries) 
     { 
      this.Logs.Add(addLog); 
     } 
     return base.SaveChanges(); 



    } 
+0

你的意思是「實體框架?」 –

+0

感謝編輯 – jheatherington

+0

'OriginalValue'是否沒有值,還是拋出某種異常? –

回答

1

看看這個article,作者提到,他的第一approach失敗插入和他改造的東西一點。

0

您可能想查看Codeplex上的AuditDBContext項目。 http://auditdbcontext.codeplex.com/

作者存儲更新或刪除新值與舊保存與其他細節,如提交行動的用戶,時間戳etcetera等。

該項目的源代碼將向您展示如何獲取舊值。