Entity Framework - уведомление об изменении базовых данных (в базе данных)

Я использую Entity Framework для управления данными в базе данных с успехом.

Тем не менее, я хотел бы иметь несколько приложений, одновременно играющих с данными (параллельная версия).

Есть ли способ получить уведомление при изменении данных в базе данных?

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

Привет,

Ник

ИЗМЕНИТЬ

Возможно, мои вопросы были недостаточно ясными, я попытаюсь проиллюстрировать это на примере.

  • Приложение № 1 использует структуру сущностей в базе данных # 1
  • Приложение # 2 также использует инфраструктуру сущности в базе данных # 1
  • Приложение №1 изменяет модель сущности, которая отражается изменением базовой таблицы базы данных # 1
  • Я хочу, чтобы приложение №2 получало уведомление об этом изменении, поэтому оно может иметь согласованные /up 2date данные.

Ответы

Ответ 1

Возможно, вам стоит подумать об использовании EF в вашем приложении. EF-контекст должен использоваться как можно более короткий промежуток времени:

  • Создать контекст
  • Загрузка данных
  • Изменить данные
  • Сохранить данные
  • Падение контекста

Из-за внутренней реализации (IdentityMap, UnitOfWork) длительный жизненный контекст не является хорошим выбором и с коротким жизненным контекстом вы вообще не хотите, чтобы упомянутое поведение вообще не было. Даже в настольном приложении вы должны использовать подход, такой как контекст для каждой формы. Вы загружаете данные, представляете данные своему пользователю, и до этого времени только пользователь может изменять данные и нажимать кнопку "Сохранить" - ответственность за работу с concurrency связана с ответственностью за приложение concurrency (timestamp). Автоматическая модификация данных, которые являются частью рабочей единицы работы, - довольно плохая идея - что, если пользователь уже изменил данные? Вы перезапишите его изменения?

Edit:

Вы можете узнать больше о impelementation ObjectContext здесь.

Я могу представить сценарии, в которых требуется уведомление об обновлении данных для клиентских приложений. Это может быть отображение данных реального времени только для чтения - например, информация о торговле акциями. Но в таком случае вам нужно что-то более мощное. Это не сценарий клиентского вызова ORM для получения данных, а сценарий для подписчика клиента на какой-либо сервисный/средний уровень, который обрабатывает поиск данных и быстрое уведомление об изменении.

Для простых сценариев, где вам нужно только обновить данные в режиме полу реального времени, вы можете использовать опрос - ваш клиент снова вызовет запрос в течение нескольких секунд и будет использовать StoreWins. Любая стратегия уведомления выходит за рамки EF - вы должны реализовать ее как триггер, зависимость sql, опубликовать шаблон подписки или что-то еще. Даже с уведомлением вы сможете обрабатывать какое-либо событие и запрашивать данные.

Опять же, если вы хотите сократить передачу данных с помощью опроса, вам понадобится некоторый уровень обслуживания/среднего уровня, который обеспечит некоторый уровень кэширования (вы также можете попробовать службы данных WCF).

Ответ 2

На уровне базы данных вы можете поместить столбец timestamp в свою таблицу и использовать это, чтобы определить, была ли строка обновлена ​​с момента извлечения. Это можно проверить с помощью триггера, который вы предлагаете, или с помощью системы мониторинга в коде С#, или если вы просто хотите предотвратить переписывание изменений, вы можете написать обновления sprocs, которые проверяют отметки времени, и использовать их для сохранения ваших объектов.

Независимо от того, какой вариант вы выберете, вам придется заранее решить, как вы хотите управлять конфликтами.

Элемент управления concurrency с меткой времени

Ответ 4

Я не знаю, какой провайдер вы используете. В любом случае оба Devart и ODP поддерживают уведомление БД. Для Devart вы можете увидеть следующую ссылку Класс OracleDependency