我应该如何从实体框架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类型。正确的做法是什么?

我应该如何从实体框架4.1的存储过程返回一个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)