微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EF 错误的解决方法?

如何解决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 举报,一经查实,本站将立刻删除。