1

Я работаю по следующему сценарию:Entity Framework прослушивания SQL Server изменяет

У меня есть консольная вверх, заполняющая база данных SQL Server с некоторыми данными. У меня есть еще одно веб-приложение, которое считывает одну и ту же базу данных и отображает данные на интерфейсе. Оба приложения используют Entity Framework для связи с базой данных (они имеют одну и ту же строку соединения).

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

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

ответ

1

я имел аналогичное требование, и я решил его с помощью функции EF:

[context].Database.CompatibleWithModel(throwIfNoMetadata: true) 

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

Обратите внимание, что я использовал Код Первый подход.

Определение MSDN ниже:

http://msdn.microsoft.com/en-us/library/system.data.entity.database.compatiblewithmodel(v=vs.103).aspx

Edit:

Просто нашел удивительную статью с демонстрацией:

http://blog.oneunicorn.com/2011/04/08/code-first-what-is-that-edmmetadata-table/

+0

О, это прекрасно. Большое спасибо. Но как бы вы решили найти фактическое изменение. Например, вы можете достичь детализации конкретной таблицы (или даже записи) изменений. – ppoliani

+0

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

+0

Правильно, если я ошибаюсь, но я думаю, что этот CompatibleWithModel вернет false, если структура модели изменилась (например, свойство было добавлено), а не фактические значения. – ppoliani

0

Это не то, что связано к EF вообще. EF - это просто библиотека, которая вызывает вызовы SQL и сопоставляет их с объектами. У него нет внутренних знаний о базе данных. Таким образом, когда данные изменяются в одном приложении, другое приложение не знает, если они не запрашивают, будут ли эти данные изменяться (и вы не будете постоянно запускать запросы, чтобы знать это, это слишком непрактично).

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

Раньше это называлось Notification Services, но это было устарело. Теперь есть что-то, называемое объектами SqlDependency, которое может помочь вам в некоторых случаях .. но все зависит от того, что вы пытаетесь сделать точно.

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

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