【发布时间】:2016-12-02 00:21:42
【问题描述】:
我使用以下代码将存储过程映射到我的模型:
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);
它抛出错误:
未处理的类型异常 'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException' 发生在EntityFramework.dll中
附加信息:存储更新、插入或删除语句 影响了意外数量的行 (0)。实体可能已经 自加载实体后修改或删除。看 http://go.microsoft.com/fwlink/?LinkId=472540 获取有关信息 理解和处理乐观并发异常。
存储过程的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
有谁知道如何以正确的方式修复此错误?
【问题讨论】:
-
如果您只打算调用存储过程,为什么还要使用实体框架?也许你应该考虑像 Dapper 这样更轻的东西
-
@DavidL 这是一种将普通 CUD 语句重定向到 stored procedures 的方法。读取将通过常规 LINQ 语句完成。
-
我不熟悉 Mysql 语法,但是 sproc 应该返回新插入行的生成键值(如果有任何生成的键值)。以及计算字段的值(如果有)。
-
是的,存储过程应该返回插入的行数,但它不返回,我认为 mysql 不支持它。我应该抓住异常吗?
-
返回插入的行数 - 你没有阅读我写的内容。
标签: c# mysql entity-framework stored-procedures