实体框架在循环中调用存储过程返回不正确的结果

时间:2012-12-12 17:11:51

标签: c# entity-framework sql-server-2005

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

  

PrevLocationId | PrevLocationName | NextLocationId | NextLocationName   | BatchId |的ConnectionId

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

使用第一版Entity Framework在C#app中调用此存储过程。

在app中有一个TransactionScope,在一个循环内部将用不同的参数执行这个sproc。

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

  

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

当我在sproc调用上设置断点并且我直接在数据库上执行它时,我在两次执行时得到了正确的结果,但是当我允许应用程序执行它时我总是得到来自首次执行两次。

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

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

是否有人知道实体框架是否存在一些奇怪的缓存事件,或者是否存在故障或可能影响返回结果的事情?

我不知道在哪里可以看。任何见解都会非常感激。

1 个答案:

答案 0 :(得分:0)

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

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

  1. 使用Ado .Net调用存储过程。
  2. 添加Guid作为存储过程的第一个参数,以便Entity Framework知道始终有新的调用,不应使用缓存的结果。
  3. 在Entity Framework第4版中,ObjectContext.ExecuteFunction具有重载,我们可以在其中将MergeOption设置为NoTracking,这将解决此类问题。