2013-05-05 84 views
2

我有一個小麻煩了解什麼DetectChanges確實在此代碼(使用EF 4.3):爲什麼ObjectContext.DetectChanges沒有將狀態重置爲不變?

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); 
} 

我看到的是 不變 修改 修改

因爲我重置名稱的價值到原始值,爲什麼DetectChanges沒有意識到所有的屬性值都匹配原始值的快照並將State設置爲Unchanged? (我知道在這裏調用DetectChanges可能是多餘的,因爲我在調用它之前訪問一個條目,但我想看看它是否會修復狀態)。

回答

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。在你簡單的例子中,重置狀態可能是正確的,但在更一般的情況下......誰知道。也許這樣的跟蹤所有變化(而不是隻有原始和當前狀態)對於一個安全的解決方案來說太複雜了,所以沒有人實現它。

只是猜測...

+0

這聽起來很合理,不能與你的邏輯爭論!感謝你的想法。 – jimslate 2013-05-18 22:18:50

相關問題