Первый код EF 4.1 с добавлением триггера в таблицу

Каков наилучший способ добавить триггер в таблицу, созданную с помощью подхода, основанного на кодах, с EF 4.1?

Способ, которым я являюсь, заключается в выполнении пользовательского SQL-запроса либо в OnModelCreating, либо при инициализации контекста Db.

Есть ли лучшая идея?

Ответы

Ответ 1

Использование пользовательского инициализатора, выполняющего команду CREATE TRIGGER SQL, является единственным вариантом, если вы хотите, чтобы EF создавал триггер для вас (похожий код, как здесь). Также не забудьте включить SET NOCOUNT ON в начало кода запуска.

Но существует более сложная проблема, связанная с триггерной логикой. Если вам нужен триггер, который будет изменять данные, переданные в базу данных, вы должны понимать, что изменения, сделанные с помощью триггера, не будут отражены в вашем текущем контексте. Контекст будет по-прежнему знать только объект с данными, переданными в базу данных. Обычно это решается установкой свойств, измененных триггером, как DatabaseGeneratedOption.Computed для обновления или DatabaseGeneratedOption.Identity для вставки. В таком случае вы не можете изменять свойства в своем приложении, и они должны быть изменены в базе данных. EF гарантирует, что эти свойства будут выбраны после изменения и переданы объекту. Проблема в том, что это не работает с первым кодом.

Ответ 2

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