我应该如何从实体框架4.1中的存储过程返回一个int?

Jon*_*oln 11 c# stored-procedures sql-server-2008-r2 entity-framework-4.1

我正在使用Entity Framework 4.1并且有时需要调用存储过程.其中一些返回int作为返回值.例如

CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT @@Identity
Run Code Online (Sandbox Code Playgroud)

(更新:删除返回值,不相关.我们将返回身份)

我的respository类中有以下代码:

var orderNo = context.Database.SqlQuery<int>("EXEC myProc").Single();
Run Code Online (Sandbox Code Playgroud)

这失败并显示错误消息 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();
Run Code Online (Sandbox Code Playgroud)

一切正常.

现在,我认为我应该能够返回一个int.这样做的正确方法是什么?

Eso*_*ame 10

我假设,基于您的问题的编辑 - 我在您发布后不久点击它,然后稍后刷新 - 这只是您返回身份时的问题?

如果是,则为十进制,因为@@ IDENTITY(和SCOPE_IDENTITY)返回数字(38,0).请参阅此问题的答案:为什么选择SCOPE_IDENTITY()会返回小数而不是整数? 如上所述,转换为int应该允许EF正确检测类型.


Ica*_*rus 7

不返回@@Identity或者您可能会遇到意外行为,因为@@Identity无论会话如何都返回最后一个id.请SCOPE_IDENTITY()改用

我会想象回来 SELECT cast(SCOPE_IDENTITY() as int)

会在C#方面为你做


小智 5

@@IDENTITY 返回精度为 38 且小数位数为 0 的数字类型,因此 .NET 将您的 SP 正确识别为返回小数。您可以通过在 SP 中添加演员来解决此问题:

CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT CAST(@@Identity as int)
Run Code Online (Sandbox Code Playgroud)