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正确检测类型.
不返回@@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)