【发布时间】:2015-09-17 00:25:49
【问题描述】:
我有一个应用程序在没有表上的触发器的情况下运行良好。
添加触发器以跟踪更改会导致实体框架返回错误
子查询返回超过 1 个值”消息。
但是:
- 手动执行插入 (SQL)
- 执行 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