与ObjectStateEntry的国家
问题描述:
怪异的行为我有以下的扩展方法,我不知道为什么每个条目的状态正在改变,以不变我打电话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();
}
}
我在做什么不对吗?
答
是的,这是正确的。 ObjectStateEntry.AcceptChanges类似于ObjectContext.AcceptAllChanges,除了,这将影响只有特定的实体。
重要的一点是,默认情况下,它已经完成了数据库修改后的的SaveChanges方法调用AcceptAllChanges方法。然后AcceptAllChanges推动每连接实体的当前值到原来的值,然后改变他们EntityState到不变。
正如你所看到的,您的问题的事实,context.SaveChanges()叫您的foreach的第一次迭代,因此一个AcceptAllChanges()由的SaveChanges()调用未来那让大家都进去了不变的状态。
不应该entry.AcceptChanges()只接受特定的实体和变化不是整个背景? – zSynopsis 2010-10-01 20:00:55