为什么ObjectContext.DetectChanges没有将State重置为Unchanged?

时间:2013-05-05 19:26:13

标签: c# entity-framework-4 objectcontext

我在理解DetectChanges在此代码中的作用时遇到了一些麻烦(使用EF 4.3):

using (var context =new BreakAwayContext())
{
var f = context.Destinations.First();
Console.WriteLine(context.Entry(f).State);
f.Name = "something";
Console.WriteLine(context.Entry(f).State);
context.Entry(f).Property(x => x.Name).CurrentValue =
    context.Entry(f).Property(x => x.Name).OriginalValue;
context.ChangeTracker.DetectChanges();
Console.WriteLine(context.Entry(f).State);
}

我看到的是     不变     改性     改性

由于我将Name的值重置为其原始值,为什么DetectChanges没有意识到所有属性值都与原始值的快照匹配,并将State设置回Unchanged? (我意识到在这里调用DetectChanges可能是多余的,因为我在调用它之前访问了一个Entry,但我想知道它是否会修复State。)

1 个答案:

答案 0 :(得分:2)

状态可以手动设置为Modified,例如:

var f = new Destination { Name = "something" };
context.Entry(f).State = EntityState.Modified; // attaches to context implicitly

context.ChangeTracker.DetectChanges();

EF会在这里检测到OriginalValue == CurrentValue。但是如果它将状态设置为Unchanged,因为它会使强制实体进入状态Modified失败 - 无论出于何种原因,开发人员都希望如此。< / p>

EF必须跟踪状态变化的完整历史记录Modified如何确定是否可以安全地将状态重置为Unchanged。在你的简单例子中,重置状态可能是正确的,但在更一般的情况下......谁知道。也许这样跟踪所有更改(而不仅仅是原始状态和当前状态)对于安全解决方案而言过于复杂,因此没有人实现它。

只是一个猜测......