【问题标题】:EF 4.1 code-first adding a trigger to a tableEF 4.1 代码优先向表中添加触发器
【发布时间】:2011-08-20 06:41:43
【问题描述】:

向使用 EF 4.1 的代码优先方法创建的表添加触发器的最佳方法是什么?

我正在考虑的一种方法是在 OnModelCreating 中或在初始化 Db 上下文时执行自定义 SQL 查询。

有更好的主意吗?

【问题讨论】:

    标签: entity-framework-4.1


    【解决方案1】:

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

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

    【讨论】:

    • 在我当前的场景中,我需要更新其中一个表中的“DateModified”列。当前上下文不会使用“DateModified”的值。
    • 实际上考虑了一下,因为 POCO 对象是由上下文跟踪的,我可以利用它来更新我的时间戳吗?
    • "DateModified" 不会被上下文使用 不符合代码优先方法,在这种方法中,您只定义上下文使用的列。
    • 您当然可以在保存更改之前在上下文中更改DateModified,方法是覆盖SaveChanges迭代所有修改的实体并设置字段。
    • "DateModified" 将被使用,但不在 current 上下文中。感谢您提供所有信息!
    【解决方案2】:

    我不完全确定你的意思。如果你想在表上创建一个实际的 SQL 触发器,那么我会像往常一样在 SQL 中创建触发器。如果您的意思是您希望在修改其中一个实体集时在代码中进行某种处理/更新,那么我认为您希望执行一个自定义方法,该方法将在更新该实体集时调用。

    【讨论】:

    • 我确实需要一个表上的实际触发器。如果我直接在 SQL 中创建它,它将因为这个“DropCreateDatabaseIfModelChanges”而丢失。
    • 如果需要 SQL 触发器,您可以随时创建脚本并在重新创建表时运行它。不过,这有点恶心。 Ladislav 提出了一个很好的观点 - 每当您的触发器运行时,您都需要刷新您的上下文。如果它可以在代码中完成,我想你会省去一些麻烦。
    • 这根本没有意义......为什么不利用 SQL 与从代码中对数据库进行二次调用呢?编写和执行的代码更少,而且它使 SQL 做它应该做的事情,也就是触发器。更不用说,它减少了对数据库的一次调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多