我在理解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。)
答案 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
。在你的简单例子中,重置状态可能是正确的,但在更一般的情况下......谁知道。也许这样跟踪所有更改(而不仅仅是原始状态和当前状态)对于安全解决方案而言过于复杂,因此没有人实现它。
只是一个猜测......