Почему EF читает мой неизмененный объект в SaveChanges? - PullRequest
0 голосов
/ 23 февраля 2012

В рамках некоторых тестов Entity Framework Code First я тестирую отслеживание изменений.В небольшой тестовой базе данных у меня есть две машины в таблице, с которой я запускаю метод тестирования:

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

Я добавил вывод трассировки в методы получения и установки свойств TopSpeed и Brandкласса Car, чтобы увидеть, как к ним обращаются.TopSpeed - это int?, а Brand - это свойство навигации для объекта Brand.Выполнение приведенного выше кода дает следующий вывод:

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 ]

3 голосов
/ 24 февраля 2012

Даже если все требования к прокси-серверу отслеживания изменений были выполнены, EF все еще использует автоматическое отслеживание изменений, если явно не отключено:

context.Configuration.AutoDetectChangesEnabled = false;

Документация по AutoDetectChangesEnabled сбивает с толку:

Истина, если автоматическое обнаружение изменений в конфигурации включен; в противном случае - ложь.

Глядя на блог ADO.NET , они объясняют это правильно.

3 голосов
/ 27 февраля 2012

В EF 4.1, 4.2 и 4.3, работающей в .NET 4, есть ошибка (или, скорее, отсутствие оптимизации), которая приводит к тому, что DetectChanges обрабатывает объекты, о которых известно, что отслеживание изменений не требуется.Это связано с тем, что EF, работающий в .NET 4, не отслеживает, существуют ли какие-либо объекты, для которых требуется отслеживание изменений, или нет, поэтому он должен проверять каждый раз.

Это исправлено в EF5 при работе в.NET 4.5, которая скоро будет доступна в бета-версии.Я только что проверил, что в EF5 в .NET 4.5 средства получения неизменных прокси-серверов отслеживания изменений не вызываются в SaveChanges, даже если для AutoDetectChangesEnabled установлено значение true.

При этом даже в EF 4.1-4.3не верьте, что метод get должен вызываться, если все, что EF делает, проверяет, является ли объект прокси-сервером отслеживания изменений, поэтому, похоже, здесь может быть еще одна ошибка.

2 голосов
/ 23 февраля 2012

Чтобы включить динамическое отслеживание изменений, вам нужно сделать все ваши скалярные (не навигационные) свойства виртуальными.

...