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

时间:2011-11-15 15:05:54

标签: c# stored-procedures entity-framework-4.1 sql-server-2008-r2

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

CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT @@Identity

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

我的资源库类中有以下代码:

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。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:10)

我认为,根据您的问题的编辑 - 我在您发布后不久点击它,然后稍后刷新 - 这只是您返回身份时的问题?

如果是,则为小数,因为@@ IDENTITY(和SCOPE_IDENTITY)返回数字(38,0)。请参阅此问题的答案:Why does select SCOPE_IDENTITY() return a decimal instead of an integer? 如上所述,强制转换为int应该允许EF正确检测类型。

答案 1 :(得分:7)

不要返回@@Identity,否则可能会遇到意外行为,因为无论会话如何,@@Identity都会返回最后一个ID。请改用SCOPE_IDENTITY()

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

C#方面会为你做什么

答案 2 :(得分:4)

@@ IDENTITY返回一个精度为38且标度为0的数字类型,因此.NET正确地将您的SP识别为返回小数。您可以通过在SP中添加强制转换来解决此问题:

CREATE PROCEDURE ...
...
INSERT INTO ...
SELECT CAST(@@Identity as int)