Entity Framework - Уведомление об изменении базовых данных (в базе данных) - PullRequest
16 голосов
/ 31 января 2011

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

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

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

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

С уважением,

Ник

РЕДАКТИРОВАТЬ

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

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

Ответы [ 4 ]

5 голосов
/ 31 января 2011

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

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

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

Редактировать:

Подробнее об имплементации ObjectContext можно прочитать здесь .

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

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

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

2 голосов
/ 31 января 2011

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

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

Управление параллелизмом на основе временной метки

0 голосов
/ 26 марта 2012

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

0 голосов
/ 31 января 2011

Вы можете использовать зависимость кэша базы данных для подобных вещей.

http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx
http://msdn.microsoft.com/en-us/magazine/cc188758.aspx

Хотя это будет немного сложнееесли у вас есть веб-приложение по сравнению с настольным / служебным приложением.

...