【问题标题】:Entity Framework saveChanges() error with T-SQL after update insert trigger on my table在我的表上更新插入触发器后,T-SQL 的实体框架 saveChanges() 错误
【发布时间】:2015-09-17 00:25:49
【问题描述】:

我有一个应用程序在没有表上的触发器的情况下运行良好。

添加触发器以跟踪更改会导致实体框架返回错误

子查询返回超过 1 个值”消息。

但是:

  1. 手动执行插入 (SQL)
  2. 执行 Entity Framework 生成的 sp_executesql(使用配置文件工具检索)

两者都工作正常。即:不重复记录。

我不知道那是什么情况。代码如下:

T-SQL 触发器:

CREATE TRIGGER [dbo].[trace_kIAlmacenTipo]
ON [dbo].[kIAlmacenTipo]
AFTER INSERT, UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON;

    DECLARE @net_ip varchar(48), @login_name varchar(50), @net_address varchar(50)
    SET @net_ip = dbo.getIP()
    SET @login_name = dbo.getLogin()
    SET @net_address = dbo.getAddress()

    INSERT INTO [trk].[kIAlmacenTipo_trk]       
        (idAlmacenTipo, tipo, descripcion, baja, fkSesion, loginname, netip, netaddress, date)
       SELECT 
           i.idAlmacenTipo, i.tipo, i.descripcion, i.baja, i.fkSesion,
           @login_name, @net_ip, @net_address, GETDATE()
       FROM inserted i
END

EF 生成的 SQL Server 语句(从分析工具中检索,在 SQL Server Management Studio 中按预期工作:)

exec sp_executesql N'UPDATE [dbo].[kIAlmacenTipo] SET [tipo] = @0, [descripcion] = @1, [baja] = @2, [fkSesion] = @3 WHERE ([idAlmacenTipo] = @4) ',N'@0 int,@1 nvarchar(50),@2 bit,@3 int,@4int',@0=6,@1=N'test++',@2=0,@3=4,@4=8

控制器代码(在kIAlmacenTipo 表上没有触发器的情况下按预期工作)

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "idAlmacenTipo,tipo,descripcion,baja,fkSesion")] kIAlmacenTipo kIAlmacenTipo)
{
        if (ModelState.IsValid)
        {                     
            try
            {                    
                kIAlmacenTipo.fkSesion = Convert.ToInt32(Session["idSesion"]);

                db.Entry(kIAlmacenTipo).State = EntityState.Modified;
                db.SaveChanges(); // here ==> catching InnerException "SubQuery returned more than 1 value...."                                

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", "Error: " + ex.Message);
            }
            return View(kIAlmacenTipo);
        }

        ViewBag.fkSesion = new SelectList(db.iOSesion, "idSesion", "ip", kIAlmacenTipo.fkSesion);
        return View(kIAlmacenTipo);
}

提前致谢。

美好的一天。

【问题讨论】:

  • 手动运行 1 和 2 时 SQL 的输出是什么?
  • @BrentMannering 手动 >> SQL 输出 >>(1 行受影响)[dbo].[kIAlmacenTipo]“首先table" 适当的记录更新,[trk].[kIAlmacenTipo_trk] "trace one" 1 新记录追加....
  • 它会被你的一个函数抛出吗?尝试用字符串替换dbo.getIP()dbo.getLogin()dbo.getAddress() 并再次测试。 EF 可能正在连接不同的帐户,因此dbo.getLogin() 的结果可能与您的手动测试不同。
  • @Padhraic 是的,dbo.getIP() 函数负责这个.....非常感谢。

标签: sql-server asp.net-mvc entity-framework triggers


【解决方案1】:

它会被你的一个函数抛出吗? 尝试将dbo.getIP()dbo.getLogin()dbo.getAddress() 替换为字符串并再次测试。 EF 可能正在连接不同的帐户,因此dbo.getLogin() 的结果可能与您的手动测试不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多