2

我有以下扩展方法,我不确定为什么在我调用entry.AcceptChanges()一个条目后每个条目状态都更改为未更改。

    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();
        }
    }

我做错了什么吗?

4

2 回答 2

1

对,那是正确的。ObjectStateEntry.AcceptChangesObjectContext.AcceptAllChanges类似,只是它只会影响特定实体

重要的一点是,默认情况下,SaveChanges方法在执行数据库修改后调用AcceptAllChanges方法。然后AcceptAllChanges将每个附加实体的当前值推入原始值,然后将它们的EntityState更改为Unchanged

如您所见,您的问题来自context.SaveChanges()在foreach的第一次迭代中调用,因此SaveChanges()调用AcceptAllChanges()并使每个人都进入Unchanged状态。

于 2010-10-01T20:33:05.840 回答
0

AcceptChanges方法按设计执行此操作。
你期望什么行为?

于 2010-10-01T15:54:42.703 回答