2010-09-30 66 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