Предотвратите попадание кэшированных объектов в базу данных с помощью Entity FrameworkC#

Место общения программистов C#
Ответить
Anonymous
 Предотвратите попадание кэшированных объектов в базу данных с помощью Entity Framework

Сообщение Anonymous »

У нас есть проект ASP.NET с Entity Framework и SQL Azure.

Большую часть наших данных необходимо обновлять всего несколько раз в день, другие данные очень нестабильны.
  • Данные, которые почти не изменяются, мы кэшируем в памяти при запуске, отделяем их от контекста и затем используем их в основном для чтения, резко уменьшая количество запросов к базе данных, которые нам приходится делать.
  • Изменчивые данные запрашиваются каждый раз DbContext для каждого Http-запроса.
  • Когда мы обновляем кэшированные данные, мы отправляем сообщение всем экземплярам, чтобы поймать свежие данные версию всех данных с SQL-сервера.
Пока все хорошо.

Пока мы не добавили ошибку, которая связывала один из этих «кэшированных» объектов с «изменчивыми» данными, и не выполнили операцию «Сохранить изменения».

Ну, это был настоящий беспорядок.

Все дерево данных добавлялось снова и снова при каждом обновлении, повреждая всю базу данных множеством дублированных данных. data.

В качестве полного хака я добавил совершенно произвольный столбец с UniqueConstraint и какими-то бессмысленными данными в одну из корневых таблиц; надеюсь, что в следующий раз, когда мы представим такую ошибку, мы не сможем выполнить SaveChanges(), потому что она нарушит ограничение уникальности.

Но это, конечно, хакерство, и я все еще очень напуган ;P
Есть ли лучшие способы предотвратить попадание в базу данных целого дерева кэшированных объектов?

Подробнее
  • Проект — ASP.NET MVC
  • Я кэширую эти данные, поскольку они в основном доступны только для чтения, и это экономит массу дополнительных вызовов базы данных на каждый HTTP-запрос.
  • Это веб-сайт с высоким трафиком и множеством индивидуальных настраиваемых представлений. Наличие данных POCO в памяти очень хорошо подходит для того, что я хочу. За исключением проблемы, о которой я упомянул.
  • Это немного сложнее, но упрощенная версия заключается в том, что я кэширую объекты по одному: то есть:

Код: Выделить всё

EntityCache.Instance.LolCats = new DbContext().LolCats.AsNoTracking().ToList();
Этот кеш я внедряю в свои контроллеры с помощью зависимостей.

Подробнее здесь: https://stackoverflow.com/questions/253 ... -framework
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»