2016-07-27 221 views
1

我映射的使用下面的代碼存儲過程,我的模型:實體框架MySQL的存儲過程

modelBuilder.Entity<Account>() 
      .MapToStoredProcedures(p => p.Insert(sp => sp.HasName("sp_InsertAccount")) 
      .Update(sp => sp.HasName("sp_UpdateAccount")) 
      .Delete(sp => sp.HasName("sp_DeleteAccount")) 
      ); 

但是當我添加記錄使用:

bank.AccountsMoves.Add(entity); 

它拋出錯誤:

An unhandled exception of type 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' occurred in EntityFramework.dll

Additional information: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions.

存儲過程的sql語句爲:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_InsertAccountMove`(
IN type int(11), 
IN account_id int(11), 
IN accountant_id int(11), 
IN amount int(11), 
IN date datetime 
) 
BEGIN 
INSERT INTO `bank`.`accounts_moves` 
(`type`, `account_id`, `accountant_id`, `amount`, `date`) 
VALUES (type, account_id, 
(SELECT id FROM accountant 
Where name = SUBSTRING_INDEX(USER() ,'@',1)) 
, amount, NOW()); 

END 

我認爲MySQL存儲過程不返回受影響的行

我使用EF 6.0的數量時,MySQL 5.7

有誰知道如何解決這個錯誤的正確方法?

+1

爲什麼使用實體框架在所有如果你只是要調用存儲過程?也許你應該考慮像Dapper –

+0

@DavidL這樣輕的東西這是一種方法來重定向正常的CUD語句[存儲過程](https://msdn.microsoft.com/en-us/data/dn468673.aspx?f=255&MSPPError = -2147217396)。閱讀將通過常規的LINQ語句完成。 –

+0

我不熟悉Mysql語法,但sproc應該返回新插入行的生成鍵值(如果存在任何生成的鍵值)。計算字段的值(如果有的話)。 –

回答

0

我解決了這個問題 添加到存儲過程的最後一行下面一行:

SELECT * FROM `bank`.`accounts_moves` WHERE id = LAST_INSERT_ID(); 
+0

我認爲這足以僅選擇id。 –