2016-07-27 3 views
1

я отображенных хранимую процедуру для моей модели, используя следующий код:Entity Framework - 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.

Заявление для хранения хранимой процедуры:

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

Зачем использовать Entity Framework на всех, если вы только собираетесь вызова хранимых процедур? Возможно, вам следует рассмотреть что-то более легкое, как Dapper –

+0

@DavidL Это способ перенаправления обычных операторов CUD на [хранимые процедуры] (https://msdn.microsoft.com/en-us/data/dn468673.aspx?f=255&MSPPError = -2147217396). Чтение будет осуществляться с помощью регулярных операторов LINQ. –

+0

Я не знаком с синтаксисом Mysql, но sproc должен возвращать сгенерированное ключевое значение (ы) вновь вставленной строки (если есть какие-либо сгенерированные значения ключа). И значения вычисленных полей (если они есть). –

ответ

0

Я решил проблему добавить в последней строке sproc следующие строки:

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

И я думаю, что достаточно выбрать только идентификатор. –

Смежные вопросы