2

我很难理解 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);
}

我看到的是 Unchanged Modified Modified

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

4

1 回答 1

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- 无论出于开发人员想要的原因。

EF 必须跟踪整个更改历史,Modified以决定它是否可以安全地将状态重置为状态Unchanged。在您的简单示例中,重置状态可能是正确的,但在更一般的情况下......谁知道。也许这种对所有更改(而不仅仅是原始和当前状态)的跟踪对于安全解决方案来说太复杂了,所以没有人实施它。

只是猜测...

于 2013-05-05T19:54:32.620 回答