【问题标题】:Why SQL Server trigger does not fire after insert using Entity Framework?为什么使用实体框架插入后 SQL Server 触发器不触发?
【发布时间】:2016-12-18 07:47:36
【问题描述】:

我有一个使用实体框架的 C# 应用程序,我在数据库中创建了一个触发器,以便在插入和更新后触发。

我注意到当我使用 EF 代码插入或更新时触发器不会触发,另一方面,当我通过 SQL Server 插入或更新时触发器会触发

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[updateLoanFinishing] 
ON [dbo].[Installments_Paids] 
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    DECLARE @totalLoan decimal, @totalpaid decimal, @balance decimal    

    SELECT @totalLoan = l.Total_Amount 
    FROM dbo.Loans l

    SELECT @totalpaid = ISNULL(SUM(ip.Paid_Amount), 0)  
    FROM dbo.Installments_Paids ip 

    SELECT @balance = @totalLoan - @totalpaid

    IF @balance = 0
    BEGIN
        UPDATE dbo.Loans
        SET dbo.Loans.IsFinish = 1 -- bit 
        FROM dbo.Loans l 
        INNER JOIN INSERTED i ON i.Loan_ID =  l.Loan_ID 
    END
    ELSE IF @balance > 0
    BEGIN
        UPDATE dbo.Loans
        SET dbo.Loans.IsFinish = 0 -- bit 
        FROM dbo.Loans l 
        INNER JOIN INSERTED i ON i.Loan_ID =  l.Loan_ID 
    END
END 

【问题讨论】:

  • Entity Framework 没有任何魔法可以让它绕过触发器。尝试运行 SQL Profiler 以查看哪些命令正在访问数据库。
  • 你忘了SaveChanges() 在你的数据库上下文吗?
  • 不,我没有忘记
  • 是否有多个实体被更改?尝试单独保存每个实体的更改
  • @ِAhmed 你找到解决办法了吗?

标签: c# sql-server entity-framework triggers


【解决方案1】:

我相信您的触发器正在被调用 - 它只是有缺陷,无法正确执行。

看看吧:

DECLARE @totalLoan decimal, @totalpaid decimal, @balance decimal    

SELECT @totalLoan = l.Total_Amount 
FROM dbo.Loans l

你想在这里做什么?您有一个名为@TotalLoan单个变量,并且您将整个Loans 表、Total_Amount 列分配给它?该表中是否只有一行?否则,这不是有效的赋值 - 你不能将整个表赋值给单个变量.....

下一条语句也是如此 - 基本上你将整个表分配给单个变量 - 这只是 不能 可能工作!

真正想在这里做什么?您可能需要在语句中添加WHERE 子句,或者您是否打算使用SUM(....) 进行这些分配,或者做其他事情来使它们起作用 - 但我很确定这个触发器 调用,它只是不能做你期望它做的事情,因为它有缺陷

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多