2012-02-23 7 views
0

Entity Frameworkコードのテストの一部として、まず変更の追跡をテストしています。私が見てCarクラスのTopSpeedBrandプロパティのゲッターとセッターにトレース出力を追加しましたEFがSaveChangesで未変更のオブジェクトを読み込むのはなぜですか?

Debug.WriteLine("Reading cars..."); 
var cars = context.Cars.ToArray(); 
Debug.WriteLine("Updating top speed of first car..."); 
Debug.WriteLine(string.Format("Type of car[0] is {0}", cars[0].GetType().ToString())); 
cars[0].TopSpeed = 260; 

Debug.WriteLine("Saving changes..."); 
context.SaveChanges(); 

:小テスト・データベースでは、私は反対テストメソッドを実行し、テーブル内の2台の車を持っていますどのようにアクセスされているか。 TopSpeedint?であり、BrandBrandエンティティのナビゲーションプロパティです。上記のコードを実行すると、以下の出力が得られます。

 
Reading cars... 
Setting TopSpeed to 210 for ABC123. 
Car: Getting TopSpeed for ABC123. 
Setting TopSpeed to 250 for XYZ987. 
Car: Getting TopSpeed for XYZ987. 
Updating top speed of the first car... 
Type of car[0] is System.Data.Entity.DynamicProxies.Car_18E3E11297DC48759312BDF1C2FFEBE9F19BAE5D487CED2A9781A6CA730071EA 
Setting TopSpeed to 260 for ABC123. 
Saving changes... 
Car: Getting Brand for ABC123. 
Car: Getting Brand for XYZ987. 
Car: Getting TopSpeed for ABC123. 
Car: Getting TopSpeed for ABC123. 
Car: Getting TopSpeed for XYZ987. 
Car: Getting TopSpeed for ABC123. 
Car: Getting TopSpeed for ABC123. 
Car: Getting TopSpeed for ABC123. 
Car: Getting TopSpeed for ABC123. 
Car: Getting TopSpeed for ABC123. 

オブジェクトのタイプは、変更追跡用のEF動的プロキシです。それでも、SaveChanges()を呼び出すと、変更されていないXYZ987車の特性が読み取られます。私は、変更の追跡によって、EFは変更されることがわかっているオブジェクトのみを読み込ませたり、何かが欠けていると思っていました。変更追跡を有効にするために追加する必要があるものはありますか?

答えて

3

は、EFはまだ自動変更の追跡を使用しています。

context.Configuration.AutoDetectChangesEnabled = false; 

AutoDetectChangesEnabled上のドキュメントは混乱しています。if

真構成の変更を自動的に検出すると が有効になります。それ以外の場合はfalseです。

ADO.NETのblogを見ると、正しく説明されています。

2

動的変更トラッキングを有効にするには、すべてのスカラー(非ナビゲーション)プロパティを仮想化する必要があります。明示的にオフにしない限り、変更追跡プロキシのすべての要件が満たされた場合でも

3

.NET上で動作するEF 4.1,4.2、および4.3にバグがあります(または最適化が不足しています)。これにより、DetectChangesは変更追跡を必要としないエンティティを処理します。これは、.NET 4上で動作するEFは、変更の追跡が必要なエンティティがあるかどうかを追跡しないため、毎回チェックする必要があるためです。

これは、.NET 4.5で動作しているEF5で修正されました。これはすぐにベータ版で利用可能になります。 .NET 4.5のEF5では、AutoDetectChangesEnabledがtrueに設定されていても、変更されていない変更追跡プロキシのプロパティのゲッターがSaveChangesで呼び出されないことが確認されました。

EF 4.1-4.3でも、すべてのEFが実行している場合は、エンティティが変更トラッキングプロキシであるかどうかを確認する必要があると思われますここに別のバグ。