我最近不得不從使用Microsofts SQL服務器切換到使用MySQL。MySQL和實體框架 - 應用程序調用存儲過程返回0行,但相同的過程在終端中工作
我寫的應用程序使用實體框架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工作臺運行相同的命令。我已經多次嘗試過,刪除數據庫並重新開始。我找不到這個原因。該請求使用類似的方法進行記錄,並且工作正常。
該應用程序對兩個存儲的例程都具有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警告和一堆其他的 - 似乎已經發生的錯誤日誌表是空的。