使用带有 MVC4 SQL Server 的实体框架插入后触发器不会触发

问题描述 投票:0回答:3

我有以下问题。

我使用触发器为我的网站进行统计。

在我的控制器中我使用以下代码:

 db.MyModel.Add(model);
 db.SaveChanges();

当我在 SQL Server Management Studio 中插入记录时,我的触发器运行良好。但是当我从网站插入记录时,我的触发器不会触发。

我在其他桌子上有类似的触发器,并且它们都运行良好。我不知道为什么只有这张表会导致问题。我还尝试删除 edmx 文件并再次创建它,但仍然没有成功。 我需要做些什么才能让它发挥作用吗?

我正在使用 Entity Framework 5、MVC4、Visual Studio 2012、MSSQL Server 2008 R2。

谢谢你。

更新#1: 当从网站插入记录时,新记录会保存到数据库中,但不会发生触发。程序不会产生任何错误。

c# sql-server entity-framework asp.net-mvc-4 triggers
3个回答
1
投票

我在使用实体框架和 SQL Server 数据库时遇到了同样的问题。

要在数据库上触发触发器,您需要在“db.SaveChanges();”之后使用“TransactionScope”发送“提交”命令。

我正在使用 Entity Framework Core 库。 这是一个例子:


using (var ts = new TransactionScope())
{
    using (var db = new DbContext()) // Modify to you Context Class
    {
        // Your logic code
            
        db.MyModel.Add(model);
        db.SaveChanges();
        
        // commit
        ts.Complete();
    }
}

1
投票

如果 SQL Server 中出现

UPDATE
INSERT INTO
语句,触发器将触发。

您的代码,如所写,不会直接执行更新,除非您之前实际上更改了一些数据

db.SaveChanges();

唯一的另一种可能性是触发器在 DML 操作之前被禁用,然后又被启用。请参阅

文档
中的DISABLE TRIGGER ...


0
投票

EF 使用

sp_executesql('query_string')
语句进行查询。在这种情况下,不会触发触发器。

编辑: @Gert Arnold - 是的,你的评论是对的。我粘贴了错误的链接,但找不到正确的链接了。公平地说,我已经删除了链接,但我的答案是正确的。即使在 SSMS 中使用

sp_executesql('query_string')
也不会触发表上的触发器。解决方法是创建一个包含所需操作的存储过程,并像这样从 EF 调用它:

dbContext.Database.SqlQuery<YourModel>("StoredProcedureName",params);

触发器将按预期触发。

© www.soinside.com 2019 - 2024. All rights reserved.