2016-12-18 43 views
2

我有一個使用實體框架的C#應用​​程序,我在數據庫中創建了一個觸發器,在插入和更新後觸發。爲什麼SQL Server觸發器在使用實體框架插入後不會觸發?

我注意到,當我插入或使用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 
+4

實體框架沒有任何讓它繞過觸發器的魔法。嘗試運行SQL Profiler以查看命中數據庫的命令。 – Saadi

+1

你忘了在你的數據庫上下文中使用SaveChanges()嗎? – zaitsman

+0

不,我沒有忘記 –

回答

1

我相信你的觸發觸發不火被稱爲 - 它只是有缺陷,無法正確執行。

看一看吧:

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

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

什麼是你想在這裏做?你有一個單變量調用@TotalLoan,你正在爲它分配整個Loans表,Total_Amount列?該表中是否只有一行?否則,這是不是有效的分配 - 你不能一個完整的表分配給一個變量.....

同去的下一條語句 - 再次你分配基本上是整個表到單變量 - 只是不能可能工作!

你在做什麼真的試圖在這裏做?您可能需要一個WHERE條款添加到您的報表,還是你打算使用SUM(....)那些分配,或做其他事,使他們的工作 - 但我敢肯定這觸發調用,它只是不能做什麼你期望它有缺陷,因爲它有缺陷