2011-05-06 146 views

回答

1

我不完全确定你的意思。如果你想在表上使用一个实际的SQL触发器,那么我会在SQL中创建正常的触发器。如果你的意思是你想要在你的代码中进行某种处理/更新,只要你修改了其中一个实体集合,那么我想你会想要做一个自定义方法,只要该实体集合被更新就会被调用。

+0

我确实需要一个表上的实际触发器。如果我直接在SQL中创建它,它会因为这个“DropCreateDatabaseIfModelChanges”而丢失。 – Dmitri 2011-05-06 15:22:04

+0

如果需要使用SQL触发器,则可以始终创建脚本,并在重新创建表时运行它。虽然这很糟糕。拉迪斯拉夫说得很好 - 任何时候你的触发器运行,你都需要刷新你的上下文。如果它可以用代码来完成,我想你会为自己节省一些头痛。 – AllenG 2011-05-06 15:32:03

+1

这完全没有道理......为什么不利用SQL与从代码中向数据库进行二次调用?编写和执行的代码更少,它使SQL执行它应该执行的操作,即触发器。更何况,这对于数据库来说是少之又少的。 – IyaTaisho 2013-02-27 16:14:03

17

使用将执行的自定义初始化程序CREATE TRIGGER如果您希望EF为您创建触发器(similar code like here),SQL命令是唯一的选项。另外不要忘记在触发代码的开始处包含SET NOCOUNT ON

但是触发逻辑有更复杂的问题。如果你想要触发器来修改传递给数据库的数据,你必须明白触发器所做的更改不会反映在当前的上下文中。上下文仍将只知道您传递给数据库的数据。这通常可以通过设置更新触发器的属性为DatabaseGeneratedOption.Computed或插入的DatabaseGeneratedOption.Identity来解决。在这种情况下,您无法修改应用程序中的属性,并且必须在数据库中对其进行修改。 EF将确保这些属性在修改后被选择并传递给实体。问题是this doesn't work with code-first

+0

在我目前的情况下,我需要更新其中一个表中的“DateModified”列。 “DateModified”的值将不会被当前上下文使用。 – Dmitri 2011-05-06 15:40:36

+0

实际上正在考虑它,因为POCO对象被上下文跟踪,我可以利用它来更新我的时间戳吗? – Dmitri 2011-05-06 15:41:53

+0

*“DateModified”不会被上下文使用*不符合您只定义上下文使用的列的代码优先方法。 – 2011-05-06 15:49:03