EF4 - данные не обновляются / обновляются - PullRequest
7 голосов
/ 06 мая 2011

У меня есть приложение MVC3, которое использует POCO / репозитории EF4. Всякий раз, когда элемент открывается пользователем на веб-сайте, он помечается в базе данных. Существует серверная служба, которая постоянно проверяет наличие каких-либо элементов, помеченных в течение более «х» секунд, и отключает их. Проблема, с которой я сталкиваюсь, заключается в том, что в моей бэкэнд-службе выполняемый запрос обнаруживает помеченные элементы, но когда я проверяю, помечен ли отдельный элемент, сущность не обновляется.

Вот мой код, который ищет помеченные элементы

 var list = Context.Transactions
            .Where(t => t.Locked).ToList() ;

list.Count () возвращает мне правильный номер. Но когда я начинаю перебирать список, я обнаруживаю, что t.Locked = false

Когда я запускаю профилировщик SQL, я вижу, что для моего кода выше данные правильно извлекаются из базы данных. Это проблема с кэшированием или картой идентификации, из-за которой я неправильно использую EF.

1 Ответ

12 голосов
/ 06 мая 2011

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

EF использует шаблон карты идентичности.Как только объект загружается контекстом, вы по умолчанию всегда получаете один и тот же экземпляр с одинаковыми значениями, несмотря на данные, возвращаемые из нового запроса.Существуют способы заставить EF обновить сущность, но это в основном для решения некоторых проблем параллелизма.

Если вы все еще не убеждены в необходимости изменить приложение, используйте это для принудительного обновления значений:

var query = (ObjectQuery)(yourLinqQuery);
query.MergeOption = MergeOption.OverwriteChanges;
// Now iterate / execute query
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...