问题描述
我前几天注意到了这个错误,今天再次确认。还发现其他人也有这个问题。
Entity Framework 将不返回任何结果(当它应该返回时)并且在以下情况下不会抛出异常:
“跳过”是指 proc 签名中参数的顺序。只要你不跳过任何可选参数就没有问题;仅当您提供了一个可选参数,该参数位于另一个您未包含的参数之后。
可能还有其他变体。例如,我怀疑如果您在跳过的可选参数之后提供一个必需参数,也会出现同样的问题……不过不确定。
现在考虑这个场景:
我在 proc 签名的末尾添加了一个新的可选参数。现在我去更新一个 sqlQuery() 调用并添加新参数,但上述错误的 b/c 我没有得到任何结果。我有两个选择:1) 我可以添加我遗漏的所有可选参数。或者 2) 我可以将新参数移到签名中更靠左的位置,这样我就不再跳过 sqlQuery() 调用中的任何参数。
当然,2) 的问题是这可能会破坏现在跳过该参数的现有代码。所以,真的,我唯一的选择似乎是一直包含所有参数,这完全违背了首先使用可选参数的整个目的。
有什么办法可以解决这个问题,或者如果我使用实体框架来调用存储的过程,我只是不得不始终传递所有参数?
编辑:我看到的另一个潜在问题是它不允许我让 sql 使用默认值,因为没有“值”可以传递给 sql 以告诉它使用默认值。您通过不传递值来告诉它使用默认值……EF 似乎无法正确处理该值。
编辑 2:
最少的可重复代码:
CREATE PROC MyProc @p1 int,@p2 int = 0,@p3 int = 0
as
select * from MyTable
where p1 = @p1
and (@p2 = 0 or p2 = @p2)
and (@p3 = 0 or p3 = @p3)
C# 代码:
List<MyObject> SomeMethod(int p1,int p3)
{
return db.Database.sqlQuery<MyObject>("dbo.MyProc @p1,@p3",new sqlParameter("@p1",p1),new sqlParameter("@p3",p3)
).ToList();
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)