使用EF 4.0调用存储过程并使用输出参数

时间:2011-10-13 05:12:44

标签: c# .net entity-framework-4

假设我有一个存储过程GetAddressInfo(addressId int, errorCode int output)。如果addressId匹配数据库中的行,则存储过程返回AddressLine1和State。如果未找到行,则将错误代码设置为非零值并且不会触发select语句。所以它看起来像这样:

if (valid address id) begin
    Set errorCode = 1
    return
end

select AddressLine1, State from ....

当我使用EF 4.0调用此类存储过程时,address id无效时会出现实体框架异常。例外情况提到列AddressLine1不是数据读取器的一部分。

我期待没有结果(没有记录)并且输出错误代码参数设置为1.相反,我得到例外。我只想停止处理剩余的存储过程并立即返回。 EF 4.0不支持这样的事情。

有关于此的任何想法吗?

提前致谢!

4 个答案:

答案 0 :(得分:1)

为什么不在通过此SP调用SP之前检查是否存在有效地址,它将始终返回有效的地址值,并且不会返回任何异常。

可能它正在发生,因为它始终与表中的记录匹配,如果它没有得到记录,它会抛出异常..

答案 1 :(得分:1)

嗯,你的方法有点奇怪 - 至少对EF来说。

在某些情况下,您执行返回AddressLine1和State(因此设置为期望这两个),而在其他情况下,您不会...因此取决于输入,输出的形状不同。 EF无法真正解决这个问题......

解决此问题的一种简单方法是始终返回这两列 - 如果addressId无效,则只返回每列的NULL

答案 2 :(得分:1)

这是反对存储过程的主要参数之一 - 业务逻辑开始在它们中结束。我不是说我投票任何一种方式 - 只要注意你遇到的是一个问题,并使单元测试更加困难。

EF通常需要知道要返回的字段(具体取决于映射方式)。具体如何调用此proc?直接在上下文中,或者它是否映射到实体操作(例如,选择 - 读取操作)

如果映射到读取操作,则需要更改执行此操作的方式。您的列输出列表应该是一致的。

答案 3 :(得分:0)

如果异常消息指出“列'AddressLine1'不是数据读取器的一部分”,那么似乎该函数在不执行select语句的情况下返回。但另一方面,您正在尝试读取数据读取器值,其中根本没有值!!

看看这篇详细的文章,了解如何使用输出参数调用EF中的存储过程。 http://weblogs.asp.net/dwahlin/archive/2011/09/23/using-entity-framework-code-first-with-stored-procedures-that-have-output-parameters.aspx