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