在我的表上更新插入触发器后,实体框架saveChanges()错误与T-SQL

时间:2015-09-17 00:25:49

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

我的应用程序工作正常,没有触发器。

添加触发器以跟踪更改会导致Entity Framework返回错误

  

子查询返回的值超过1"消息。

然而

  1. 手动执行插入(SQL)
  2. 执行Entity Framework生成的sp_executesql(使用配置文件工具检索)
  3. 两者都很好。即:不重复记录。

    我无法确定这种情况。这是代码:

    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 个答案:

答案 0 :(得分:1)

你的某个功能会抛出它吗? 尝试用字符串替换dbo.getIP()dbo.getLogin()dbo.getAddress()并再次测试。 EF可能与其他帐户相关联,因此dbo.getLogin()可能与您的手动测试结果不同。