假设我有一个存储过程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不支持这样的事情。
有关于此的任何想法吗?
提前致谢!
答案 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