向通过EF 4.1的代码优先方法创建的表格添加触发器的最佳方式是什么?EF 4.1代码 - 首先在表格中添加触发器
我正在考虑的方法是在OnModelCreating或Db上下文初始化时执行自定义SQL查询。
有更好的主意吗?
向通过EF 4.1的代码优先方法创建的表格添加触发器的最佳方式是什么?EF 4.1代码 - 首先在表格中添加触发器
我正在考虑的方法是在OnModelCreating或Db上下文初始化时执行自定义SQL查询。
有更好的主意吗?
我不完全确定你的意思。如果你想在表上使用一个实际的SQL触发器,那么我会在SQL中创建正常的触发器。如果你的意思是你想要在你的代码中进行某种处理/更新,只要你修改了其中一个实体集合,那么我想你会想要做一个自定义方法,只要该实体集合被更新就会被调用。
使用将执行的自定义初始化程序CREATE TRIGGER
如果您希望EF为您创建触发器(similar code like here),SQL命令是唯一的选项。另外不要忘记在触发代码的开始处包含SET NOCOUNT ON
。
但是触发逻辑有更复杂的问题。如果你想要触发器来修改传递给数据库的数据,你必须明白触发器所做的更改不会反映在当前的上下文中。上下文仍将只知道您传递给数据库的数据。这通常可以通过设置更新触发器的属性为DatabaseGeneratedOption.Computed
或插入的DatabaseGeneratedOption.Identity
来解决。在这种情况下,您无法修改应用程序中的属性,并且必须在数据库中对其进行修改。 EF将确保这些属性在修改后被选择并传递给实体。问题是this doesn't work with code-first。
我确实需要一个表上的实际触发器。如果我直接在SQL中创建它,它会因为这个“DropCreateDatabaseIfModelChanges”而丢失。 – Dmitri 2011-05-06 15:22:04
如果需要使用SQL触发器,则可以始终创建脚本,并在重新创建表时运行它。虽然这很糟糕。拉迪斯拉夫说得很好 - 任何时候你的触发器运行,你都需要刷新你的上下文。如果它可以用代码来完成,我想你会为自己节省一些头痛。 – AllenG 2011-05-06 15:32:03
这完全没有道理......为什么不利用SQL与从代码中向数据库进行二次调用?编写和执行的代码更少,它使SQL执行它应该执行的操作,即触发器。更何况,这对于数据库来说是少之又少的。 – IyaTaisho 2013-02-27 16:14:03