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 の値を元の値にリセットしたので、すべてのプロパティ値が元の値のスナップショットと一致し、State が Unchanged に戻されたことを DetectChanges が認識しないのはなぜですか? (Entry を呼び出す前に Entry にアクセスしているため、ここで DetectChanges を呼び出すのは冗長かもしれませんが、State が修正されるかどうかを確認したかったのです)。

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に状態にするという目的が無効になります-開発者がそれを望んでいる理由は何であれ。

ModifiedEF は、状態を安全にリセットできるかどうかを判断するために、どのように状態になったかの変更履歴全体を追跡するUnchanged必要があります。あなたの単純な例では、おそらく状態をリセットするのが正しいでしょうが、より一般的なケースでは...誰が知っていますか. おそらく、すべての変更を (元の状態と現在の状態だけではなく) 追跡することは、安全な解決策としては複雑すぎるため、誰もそれを実装しませんでした。

推測ですが...

于 2013-05-05T19:54:32.620 に答える