2013-03-05 2 views
12

Я использую EF в приложении Windows, и я хочу, чтобы мое приложение выполняло некоторые задачи, когда новая запись была вставлена ​​в определенную таблицу «эти новые записи будут вставлены веб-сайтом, используя тот же db "
Мой вопрос в том, как посмотреть эту таблицу на изменения и получить уведомление, когда придет новая запись, и может ли EF помочь мне в этом случае?Посмотрите на таблицу новых записей в базе данных sql

UPDATE: Я использовал SqlDependency класса и использовал это в БД

ALTER DATABASE UrDb SET ENABLE_BROKER

А также создали услугу, и очереди в базе данных http://screencast.com/t/vrOjJbA1y, но я никогда не получить уведомление от моего окна.
Также, когда я открываю очередь в sql-сервере, он всегда пуст http://screencast.com/t/05UPDIwC8ck швов, что что-то не так, но я не знаю.

+0

Возможно, вы ищете ['SqlDependency'] (http://msdn.microsoft.com/en-us/library/system .data.sqlclient.sqldependency.aspx), и нет ничего встроенного в EF, который поддерживает это. –

+2

Вы пробовали триггер для своей таблицы? – saeed

+2

Вы считаете, что [Использование базы данных как IPC] (http://en.wikipedia.org/wiki/Database-as-IPC) является распространенным антипаттерном? – Aron

ответ

2

Вот мои предложения:

  1. Если вы можете добавить дубликат таблицы в базу данных, то здесь решение. У вас есть ваш table1 и table2 (копия таблица1). Когда вы вставляете новые записи в table1, вы можете сравнить их с существующими записями в своем table2 и таким образом найти новые записи. После сравнения вы должны добавить все новые записи в table2. Это какая-то синхронизация. Это можно сделать с помощью хранимой процедуры или программно.

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

  3. Если вы в состоянии изменить db, вы можете добавить что-то вроде столбца isNew в таблицу. Когда новые данные поступают с веб-сайта, столбец будет «истинным», ваша программа может отслеживать это, и после обработки установите для этого флага значение false для каждой записи. (Если веб-сайт не может установить этот флаг, вы можете использовать SQL TRIGGER AFTER INSERT, чтобы установить значение флага в true. Веб-сайт не может даже знать об этой функции, если это сторонний веб-сайт, или вы не знаете хотите изменить что-нибудь там)

  4. Вот статья о EF отслеживания изменений: http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx

Но проблема в том, что вы должны проверить всю таблицу изменений через EF, бьющий производительность приложения.

Вот полезная информация о SQL Server отслеживания и реализации изменений на стороне понятий: http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/ http://msdn.microsoft.com/en-us/library/bb933994.aspx

1

Как насчет таблицы транзакций, где хранятся сведения о сделке, вставленный сайт.

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

Тогда вам нужно только ваше приложение Windows, чтобы периодически проверять таблицу транзакций, когда она что-то делает, что когда-либо хочет, а затем очищает запись в таблице транзакций.

Это не очень элегантный, но он может работать. Я не знаком с EF, и я не знаю, есть ли у него лучшее решение для этого.

1

См. Изменить данные Capture, в частности sys.fn_cdc_get_max_lsn. Это создаст место для поиска изменений.

Затем запишите хранимую процедуру для опроса этого вида. Ухватите ли вы предыдущее значение и цикл, который ищет изменение с задержкой WAITFOR, соответствующей скорости поступления данных.

Когда процедура отмечает, что самый старший LSN изменился, попросите что-нибудь сделать. Он может выбирать строки (строки). Он также может просто распечатать сообщение. Затем он возвращается на свою избирательную станцию ​​(как бы).

Печать сообщения может показаться странным и, не зная в первую очередь об EF (и будучи сильно аллергия на такие вещи), я не знаю, поможет ли это вам здесь. Но в принципе это должно быть связано с тем, что присутствует основное сообщение.

Из вашего приложения вызывается процедура. Когда инструкция T-SQL PRINT (или RAISERROR) выполняется процедурой, сообщение будет отправлено клиенту. Где он идет в EF или как вы справитесь с этим, я не могу сказать, но он должен пойти где-то полезно, потому что в обычных обстоятельствах он будет отображаться пользователю. В вашем случае ваше приложение будет искать этот номер или текст сообщения и реагировать соответствующим образом. (Другие сообщения, естественно, вы бы хотели нормально обрабатывать.)

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

1

Вы можете создать триггер SQLCLR для INSERT для таблицы. Этот триггер может вызвать простую службу WCF, которую вы можете разместить в своем приложении. Сборка с триггером должна быть зарегистрирована в SQL Server. См. here, как это сделать.

Другой подход (самый простой): использовать обычный SQL-триггер, который отслеживает INSERT в таблице и выполняет команду xp_cmdshell с командой «copy nul/Y some_file_with_path.txt». Ваше приложение может использовать класс FileSystemWatcher для просмотра изменений в тот же файл. Настройте фильтр, чтобы следить за последним доступом только к этому конкретному файлу. См. here, как это сделать. Прокси-учетная запись для xp_cmdshell должна быть определена на SQL Server.

Я столкнулся с той же проблемой некоторое время назад. Я также не смог заставить службы SQl Notifications работать.

1

Или используйте SqlTableDependency: https://tabledependency.codeplex.com/. Этот компонент с открытым исходным кодом отправляет вам событие с подробной информацией о записи в новой строке в таблице

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