为使用EF 4.1的代码优先方法创建的表添加触发器的最佳方法是什么?
我正在考虑的一种方法是在OnModelCreating中或在初始化Db上下文时执行自定义SQL查询。
有更好的主意吗?
答案 0 :(得分:19)
如果您希望EF为您创建触发器(similar code like here),则使用将执行CREATE TRIGGER
SQL命令的自定义初始化程序是唯一的选项。另外,不要忘记在触发器代码的开头包含SET NOCOUNT ON
。
但是有更复杂的问题与触发器的逻辑有关。如果您想要修改传递给数据库的数据的触发器,您必须了解触发器所做的更改不会反映在您当前的上下文中。 Context仍然只知道您传递给数据库的数据的实体。这通常通过将触发器修改的属性设置为DatabaseGeneratedOption.Computed
进行更新或DatabaseGeneratedOption.Identity
进行插入来解决。在这种情况下,您无法修改应用程序中的属性,必须在数据库中修改它们。 EF将确保在修改后选择这些属性并将其传递给实体。问题是this doesn't work with code-first。
答案 1 :(得分:1)
我不完全确定你的意思。如果你想在表上有一个实际的SQL触发器,那么我会在SQL中正常创建触发器。如果你的意思是你希望在修改你的某个实体集时在代码中进行某种处理/更新,那么我认为你想要做一个自定义方法,只要更新该实体集就会调用它。