gpt4 book ai didi

MySQL 和 Entity Framework - 调用存储过程的应用程序返回 0 行受影响但相同的过程在终端中工作

转载 作者:行者123 更新时间:2023-11-30 23:33:06 25 4
gpt4 key购买 nike

我最近不得不从使用 Microsoft 的 SQL 服务器切换到使用 MySQL。

我编写的应用程序使用的是 Entity Framework 4.0。我真的很喜欢 MySQL,但是这个过程有点痛苦。大多数 CRUD 操作都是通过存储过程完成的,所以我在遇到 MySQL bug 55778 时玩得很开心.

我克服了这个问题并手动编辑了 EDMX 文件。

一切正常,直到在一个场景中我开始收到 optimistic concurrency exception .

这是发生的地方:

using (var context = new DBEntities())
{
context.Requests.AddObject(request);
context.SaveChanges();

response.RequestId = request.Id;
context.Responses.AddObject(response);
context.SaveChanges();

}

请求被正确记录。当我尝试保存对响应的更改时抛出异常。 RequestId 是响应表的主键(不是自动递增的)。我尝试使用 MySQL 探查器来查看发生了什么,但它并没有真正起作用。我只能分析通过我的终端进行的查询,但不能分析在我的本地 IIS 上运行的应用程序进行的查询。

我最终使用了 Wireshark .我发现当我去保存响应时,链接到响应实体上的插入的存储过程被调用。 MySQL 返回一个响应说 0 行受到影响。这导致了异常。然后,应用程序调用 ROLLBACK 删除本应进行的任何更改。

如果我在终端中使用完全相同的值运行该存储过程,它就可以工作。

所以通过网络我看到它被称为:

CALL `DevDB`.`LogResponse` (1,'2012-03-06 12:30',1,1,'test','test','test','test',false,'test');

然后返回 0 行影响并调用 ROLLBACK。

从 MySQL Workbench 运行完全相同的命令。我已经尝试过多次,删除数据库并重新开始。我找不到原因。使用类似的方法记录请求并且它有效。

应用程序对两个存储例程都具有 EXECUTE 权限。

有没有人遇到过这样的事情?

编辑:我也用 MySQL handlers捕获我能想到的任何错误并将其记录到错误日志表中。例如

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
INSERT INTO `DevDB`.`tblDatabaseErrorLogs`(ERROR_MESSAGE, ERROR_CODE)
VALUES(
'SQL Exception at LogResponse',
'Unknown'
);
END;

到目前为止,我计划的错误代码——SQL 异常、SQL 警告和其他一些——似乎都没有发生,因为错误日志表是空的。

最佳答案

我发现了导致问题的原因,但我不太明白为什么。如果有人给出了很好的解释,那么我会接受它作为这个问题的答案,而不是接受我自己的答案。

这似乎是导致问题的原因。

当使用存储过程在 Entity Framework 中执行插入操作时,我发现要在运行时为应用程序中的实体提供正确的 ID,我必须在存储过程中返回该 ID。

在 MySQL 中我是这样做的:

CREATE PROCEDURE LogResponse(IN myVals)
BEGIN
Insert Into `DevDB`.`tblResponses`
(
someValueNames
)
Values
(
someValues
);

SELECT LAST_INSERT_ID() As NewResponseId;
END

返回的 SELECT 值映射使用此存储过程作为其 INSERT 函数的实体的 PK Id。

刚好我没有使用响应的返回值,因为我不需要应用程序中的Id。我猜这是一个疏忽,但当我用 SQL Server 做类似的事情时,它没有引发任何问题

SELECT SCOPE_IDENTITY() As NewResponseId

我所做的就是把那条线去掉

SELECT LAST_INSERT_ID() As NewResponseId;

现在一切似乎都在正常工作。

关于MySQL 和 Entity Framework - 调用存储过程的应用程序返回 0 行受影响但相同的过程在终端中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9598655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com