Уведомление об изменении в EF5 с несколькими экземплярами DbContext — задокументировано ли оно и где?

Я работаю над приложением, которое будет использовать EF5 в качестве ORM.

Перед запуском мне нужно было создать тесты, чтобы убедиться, что в EF5 все работает как надо. Одной из вещей, которые я тестировал, была поддержка UnitOfWork. Я смоделировал несколько единиц работы, создав несколько экземпляров DbContext (например, несколько запросов, когда время жизни DbContext установлено на PerWebRequest в IOC).

Я столкнулся с сюрпризом, так как EF5, как кажется, использует что-то вроде SqlDependency, потому что у меня следующая ситуация:

DbContext unit1 = new DbContext(), unit2 = new DbContext();
unit1.Items.Add(new Item() { Name = "Item1" });
Assert.AreEqual(0, unit1.Items.ToList().Count); // true as item is in unit1.Items.Local collection
Assert.AreEqual(0, unit2.Items.ToList().Count);

unit1.SaveChanges();

Assert.AreEqual(1, unit1.Items.ToList().Count); // true as unit1 is saved
Assert.AreEqual(1, unit2.Items.ToList().Count); // true as unit2 is somehow notified of changes

Я пытаюсь найти документацию, но ни страницы проекта EF, ни блоги, ни Google мне не помогают. Это не то, как работала старая версия EF, где не было готовой функции для уведомления других контекстов (т.е. см. этот вопрос). Хорошо, если это реализовано, но мне нужен документ, в котором говорится, что это так, потому что я боюсь, что не могу полагаться на эту функцию, и я не могу полагаться на знание того, что данные в моем контексте не изменятся, если другая единица работы завершится. , как здесь очевидно.


person Goran Obradovic    schedule 18.11.2012    source источник
comment
Счет идет в базу данных. Если вы сохраните элемент в базе данных, используя один контекст, и попытаетесь получить счет, используя другой контекст, он вернет текущее количество элементов в базе данных — это будет 1, так как будет подсчитан элемент, который был сохранен в базе данных с помощью другой контекст. Я думаю, что это работало, как это раньше, а также.   -  person Pawel    schedule 19.11.2012
comment
Я изменил тест, чтобы использовать Items.ToList().Count (также обновленный в вопросе), и он дает те же результаты, я помню о Count, я знаю, что он попадал в БД каждый раз, когда вы его вызываете (без кэширования), но когда вы используете ToList, он используется для кэширования данных.   -  person Goran Obradovic    schedule 19.11.2012
comment
Ну и ToList тоже идет в базу.   -  person usr    schedule 19.11.2012
comment
@GoranObradovic ToList() принудительно оценивает запрос и сохраняет результаты в списке. .Count в списке использует элементы в списке, а не в базе данных для подсчета. Поэтому, если вы выполните .ToList() и затем добавите элементы в базу данных. Счетчик в списке, заполненном вызовом .ToList(), не изменится, поскольку вы подсчитываете количество элементов, кэшированных в списке, и вы больше не заходите в базу данных. Но, как указал usr, есть поездка в базу данных, чтобы получить элементы для заполнения списка.   -  person Pawel    schedule 19.11.2012
comment
Да, есть поход в БД для заполнения списка, и первый раз, когда элементов 0, этот поход совершается и его нужно кэшировать в unit2, если я не ошибаюсь? Все понятно, только последняя строчка смущает.   -  person Goran Obradovic    schedule 19.11.2012
comment
.ToList() в другой конфигурации совершает еще одно обращение к базе данных. Поскольку данные находятся в базе данных, возвращается 1. Связь между контекстами отсутствует. База данных — обычное дело. Если один контекст обновляет базу данных, другой увидит данные, когда они попадут в базу данных.   -  person Pawel    schedule 20.11.2012
comment
Ну я мог бы поклясться, что в предыдущих версиях EF (3.x) это так не работало, было кеширование и только первый раз надо было идти в БД, а последующие вызовы не показывали новинки, я это помню Мне нужно было сделать явный вызов метода Reload, чтобы показать это. Однако мне нужно будет создать проект со старой версией, чтобы доказать это.   -  person Goran Obradovic    schedule 20.11.2012