0

У меня есть приложение MVC, размещенное как веб-роль Azure, и у меня также есть роль Работника, которая проверяет некоторые данные и обновляет записи в базе данных. Родительские данные проверяют данные каждые 15 минут.Entity Framework отменяет изменения

Вчера я столкнулся с большими неприятностями, потому что многие изменения, сделанные с помощью приложения MVC, просто вернулись.

Я попытаюсь дать пример:

  1. Пользователь сделал изменения на один объект вчера (это отслеживается журнал событий)

  2. В то же время, работник роль обновляется, что объект

  3. Сегодня, пользователь обновил сущность несколько раз

  4. В конце сущность имеет данные со вчерашнего дня, а не м сегодня

Приложение MVC использует простую функцию SaveChanges, в то время как рабочая роль использует BeginTransaction с SaveChanges.

Я подозреваю, что на уровне блокировки и изоляции, но странно, что замок почти 24 часа.

Я надеюсь, что кто-то поймет это и поможет мне.

Благодаря

+0

Вы сохраняете контекст базы данных EF где-то, как свойство, или объявляете новый, а затем удаляете для каждой операции БД? –

+0

Да, в роли работника –

ответ

1

Если вы сохраняя постоянный контекст базы данных EF в вашем рабочем роли, возможно, вы видите эффекты объектов EF кэшируются.

  1. Рабочая роль загружает сущность и что-то делает с ней. Поскольку вы не создаете и не удаляете контекст EF каждый раз, объект остается кэшированным.

  2. Пользователь сохраняет объект, и база данных обновляется с их изменениями.

  3. Запросы роли рабочего для объекта снова, но поскольку он кэширован, он возвращает устаревшую, кэшированную версию. Он выполняет некоторую операцию сохранения, перезаписывая изменения пользователя с кешированными значениями.

См Entity Framework and Connection Pooling, в частности,

При использовании EF его по умолчанию нагрузок каждый объект только один раз в контексте. Первый запрос создает объект instace и сохраняет его внутри. Любой последующий запрос, для которого требуется объект с тем же ключом, возвращает этот хранимый экземпляр . Если значения в хранилище данных изменились, вы все равно получаете объект со значениями из исходного запроса.

В нижней строке вы никогда не должны постоянно сохранять контекст базы данных EF в течение длительных периодов времени. Вы можете думать об этом как о простом подключении к базе данных, но это гораздо больше, а «оптимизация» вещей, поддерживая его, - это ложные сбережения и вызовет плохие вещи. Он предназначен для использования в шаблоне UoW, где вы его создаете, выполняйте операции, которые необходимо выполнить, и затем утилизируйте его как можно скорее.

Смежные вопросы