繁体   English   中英

实体框架在循环中调用存储过程返回错误结果

[英]Entity Framework calling stored procedure in a loop returning incorrect results

我有一个存储过程,返回的内容与此类似:

PrevLocationId | PrevLocationName | NextLocationId | NextLocationName | BatchId | 连接ID

它接收两个参数,BatchId和ConnectionId分别是bigint和int。

使用Entity Framework的第一个版本在C#应用程序中调用此存储过程。

在应用程序中,有一个TransactionScope,在一个循环中,该循环将使用不同的参数执行此sproc。

我正在验证应用程序中的缺陷,在该缺陷中,在我的测试中,循环使用以下参数运行了两次:

第一次运行:BatchId = 34,ConnectionId = 20
第二次运行:BatchId = 34,ConnectionId = 23

当我在sproc调用上设置断点并直接在数据库上执行该断点时,两次执行都得到正确的结果,但是当我允许应用程序执行该断点时, 我总是从第一次执行中两次都得到结果。

我已经在SQL事件探查器中验证了数据库在每次执行中都接收到正确的参数。

我尝试删除具有相同结果的交易范围。

是否有人知道实体框架是否执行某些奇怪的缓存操作,或者是否存在故障或可能影响返回结果的内容?

我不知道还能去哪里。 任何见识将不胜感激。

事实证明,在Entity Framework的第一个版本中,ObjectContext.ExecuteFunction的合并选项默认值为AppendOnly,您无法将其设置为其他任何内容。

在这种情况下,我们可以想到只有两种解决方法可以解决此问题:

  1. 使用Ado .Net调用存储过程。
  2. 添加Guid作为存储过程的第一个参数,以便Entity Framework知道总是有一个新调用,并且不应使用缓存的结果。

在Entity Framework版本4中,ObjectContext.ExecuteFunction具有重载,在重载中,我们可以将MergeOption设置为NoTracking,这将解决此类问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM