我应该如何从实体框架4.1的存储过程返回一个int
本文关键字:返回 int 一个 存储过程 实体 框架 我应该 | 更新日期: 2023-09-27 18:14:57
我使用实体框架4.1,有时需要调用存储过程。其中一些返回int作为返回值。例如
CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT @@Identity
(Update:删除返回值,不相关。我们将返回标识符)
在我的责任类中有以下代码:
var orderNo = context.Database.SqlQuery<int>("EXEC myProc").Single();
此操作失败,并显示错误消息The specified cast from a materialized 'System.Decimal' type to the 'System.Int32' type is not valid.
var orderNo = context.Database.SqlQuery<decimal>("EXEC myProc").Single();
一切正常。
现在,我认为我应该能够返回一个int类型。正确的做法是什么?
我假设,基于对你的问题的编辑-我在你发布后不久点击了它,然后刷新了一会儿-这只是一个问题,当你返回身份?
如果是,则是小数,因为@@IDENTITY(和SCOPE_IDENTITY)返回的是数字(38,0)。看看这个问题的答案:为什么select SCOPE_IDENTITY()返回一个小数而不是整数?如前所述,将类型转换为int应该允许EF正确检测类型。
不要返回@@Identity
,否则您可能会遇到意想不到的行为,因为@@Identity
返回最后一个id,而不管会话。用SCOPE_IDENTITY()
代替
我想象返回SELECT cast(SCOPE_IDENTITY() as int)
@@IDENTITY返回精度为38,比例为0的数字类型,因此。net正确识别您的SP返回小数。您可以通过在SP:
中添加强制转换来修复此问题。CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT CAST(@@Identity as int)