2011-10-13 163 views
1

说我有一个存储过程GetAddressInfo(addressId int, errorCode int output)。存储过程返回AddressLine1和State,如果addressId与数据库中的某一行匹配。如果未找到行,则错误代码设置为非零值,并且不会触发select语句。因此,它应该是这样的:用EF 4.0调用存储过程并使用输出参数

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

该地址ID验证属于您的应用程序... –

+0

理想情况下,是的,地址ID将在应用程序层进行验证,但我正在处理的项目有大量类似逻辑的存储过程。我试图找到将它们移动到实体框架的简单方法。 – Eric

回答

1

这是反对存储过程的主要论据之一 - 业务逻辑开始最终落入其中。我不是说Im以任何一种方式投票 - 只要注意你遇到的问题是一个问题,并使单元测试更难一点。

EF通常需要知道正在返回的字段(取决于您如何映射)。你具体如何调用这个过程?直接在上下文中,或映射到实体操作(例如,选择读取操作)

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

+0

业务逻辑和它应该属于哪里始终是一个热门话题。这是一个现有的项目,我试图从使用第三方数据库层转换到EF 4.0。我们有相当多的这种逻辑存在的sps。我现在明白EF 4.0倾向于将所有内容映射到对象中,并期望列输出一致。我们只需慢慢离开这个sps逻辑,不再使用'return'语句。我在某处读到英国外交部现在在'回归'声明中表现良好。 – Eric

1

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

可能是它正在发生,因为它总是从匹配的表,并在情况下,如果不把它抛出异常的记录备案..

1

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

在某些情况下,你回报AddressLine1和国家(所以它的成立,预计这两个),和在其他国家,你不...所以取决于输入,该形状你的输出是不同的。 EF无法真正处理...

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

+0

逃脱我的部分是EF始终期待从存储过程返回的东西。我期待它仍然能够工作,因为我没有真正改变我的输出(不添加或删除列),而是没有返回任何东西。换句话说,如果无法遍历DataReader,请不要引发异常。 – Eric

相关问题