2010-09-30 63 views
2

怪異的行爲我有以下的擴展方法,我不知道爲什麼每個條目的狀態正在改變,以不變我打電話entry.AcceptChanges()上一個條目後。與ObjectStateEntry的國家

public static void SaveWithLogging(this ObjectContext context) 
    { 
     IEnumerable<ObjectStateEntry> entries = context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added | EntityState.Deleted); 
     foreach (var entry in entries) 
      CreateTransactionLog(context, entry); 
    } 


    private static void CreateTransactionLog(ObjectContext context, ObjectStateEntry entry) 
    { 
     using (TransactionScope transaction = new TransactionScope()) 
     { 

      string operationType = entry.State.ToString(); 

      context.SaveChanges(SaveOptions.DetectChangesBeforeSave); 
      if (entry.State == EntityState.Added) entry.AcceptChanges(); 

      var columnNames = (from p in entry.EntitySet.ElementType.Members 
           select p.Name) 
           .ToList(); 

      Log log = new Log(); 
      log.CreateDate= DateTime.Now; 
      log.UserName = "Test"; 
      log.Operation = operationType; 
      context.AddObject("Logs", log); 

      foreach (var columnName in columnNames) 
      { 
       string oldValue = entry.State == EntityState.Added ? string.Empty : entry.OriginalValues[columnName].ToString(); 
       string newValue = entry.CurrentValues[columnName].ToString(); 
       if (oldValue.CompareTo(newValue) != 0) 
       { 
        // Create Log Details 
        LogDetail logDetails = LogDetail(); 
        logDetails.LogId = log.LogId; 
        logDetails.TableName = entry.EntitySet.Name.ToString(); 
        logDetails.Field = columnName.ToString(); 
        logDetails.Before = oldValue; 
        logDetails.After = newValue; 
        logDetails.PKValue = entry.CurrentValues[0].ToString(); 
        context.AddObject("LogDetails", logDetails); 
       } 
      } 
      context.SaveChanges(); 
      transaction.Complete(); 
     } 
    } 

我在做什麼不對嗎?

回答

1

是的,這是正確的。 ObjectStateEntry.AcceptChanges類似於ObjectContext.AcceptAllChanges除了,這將影響只有特定的實體

重要的一點是,默認情況下,它已經完成了數據庫修改後的的SaveChanges方法調用AcceptAllChanges方法。然後AcceptAllChanges推動連接實體的當前值到原來的值,然後改變他們EntityState不變

正如你所看到的,您的問題的事實,context.SaveChanges()叫您的foreach的第一次迭代,因此一個AcceptAllChanges()的SaveChanges()調用未來那讓大家都進去了不變的狀態。

0

AcceptChanges方法,通過設計來實現的。
你期望什麼行爲?

+0

不應該entry.AcceptChanges()只接受特定的實體和變化不是整個背景? – zSynopsis 2010-10-01 20:00:55