2012-03-07 19 views
1

我最近不得不從使用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警告和一堆其他的 - 似乎已經發生的錯誤日誌表是空的。

回答

0

我發現是什麼導致了這個問題,但我不明白爲什麼。如果有人給出了一個很好的解釋,那麼我會接受這個問題作爲這個問題的答案,而不是接受我自己的答案。

這似乎是導致問題的原因。

當使用存儲過程在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值映射使用這個存儲過程作爲其插入功能實體的PK的標識。

它只是發生了,我沒有使用響應的返回值,因爲我不需要在應用程序中的Id。這是一個疏忽,我想,但是當我做了與SQL Server

SELECT SCOPE_IDENTITY() As NewResponseId 

我所做的修復就是刪除行

SELECT LAST_INSERT_ID() As NewResponseId; 
類似的事情,也沒有提出任何問題

一切似乎正在工作,因爲它現在應該。

相關問題