EF 错误的解决方法?

问题描述

我前几天注意到了这个错误,今天再次确认。还发现其他人也有这个问题。

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 (将#修改为@)