【问题标题】:SQL Server Trigger not work propertly with Entity Framework and Self Tracking EntitiesSQL Server 触发器无法与实体框架和自跟踪实体一起正常工作
【发布时间】:2017-09-01 10:40:30
【问题描述】:

我在 SQL Server 中有一个包含这些列的表:

  • 姓名
  • 说明
  • 音量
  • 最后更新

对于这个表有一个触发器

CREATE TRIGGER [dbo].[Table1_Trigger1]
ON [dbo].[Deals]
AFTER INSERT, UPDATE
AS 
BEGIN
    IF(UPDATE(Volume))
    BEGIN
        UPDATE Table2
        SET TotalVolume = Volume * 100;
    END
END

问题是即使描述列更新(由实体框架)而不是卷列,其他表记录也会更新。

【问题讨论】:

  • 首先向我们展示完整的触发代码
  • 触发器有600行代码。问题不在触发代码中。看起来实体框架会更新所有字段,即使它们没有更改,然后触发器进入 IF
  • 把东西排除在外,向我们展示一个可重现的触发器。没有任何代码,我们只能猜测发生了什么
  • 请编辑您的问题并将触发器示例放在那里,而不是在评论中
  • UPDATE() 本质上告诉您该列是否在SET 子句中提及,不它是否确实导致发生更改。

标签: sql-server entity-framework triggers


【解决方案1】:

您的触发器中可能需要这样的东西 示例将需要您进行更改,我不知道您的表格布局以及您想要实现的确切目标。

update table2
set    TotalValue = Volume * 100
where  ID in (select i.ID from inserted i 
              left outer join deleted d on i.ID = d.ID
              where i.Volume <> isnull(d.Volume, -1)
             )

还要注意,当你插入的时候,被删除的表会是空的。

【讨论】:

  • 问题不在于触发器,而在于实体框架(我相信)。问题是 IF 永远不会失败,即使它应该失败
  • 您可以通过修改 SSMS 中的记录(而不是 EF)来测试它,看看会发生什么
  • 但同样,当您只更新一条或一条语句中的多条记录时,结果会有所不同
  • 我现在是这个,但我一次只更新一条记录。我已经用 SSMS 进行了测试,触发器工作正常
  • @christiancut - 您应该从与之交互的任何特定应用程序中单独对您的数据库进行建模。仅仅因为您当前的应用程序不执行任何多行插入或更新不意味着您不应该考虑它可能在未来或广告-可能不需要应用 hoc SQL 更新。因此,为多行 DML 部署一个损坏的触发器就是在部署一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2017-06-09
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多