0

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

上一页LocationId | 上一页位置名称 | 下一个位置 ID | 下一个位置名称 | 批号 | 连接 ID

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

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

在应用程序中有一个 TransactionScope,在一个循环中,它将使用不同的参数执行这个存储过程。

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

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

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

我在 SQL Profiler 中验证了数据库在每次执行中都接收到正确的参数。

我尝试删除具有相同结果的事务范围。

有谁知道实体框架是否有一些奇怪的缓存东西,或者它是否存在故障或可能影响返回结果的东西?

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

4

1 回答 1

0

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

在这种情况下,我们只能想到两种解决方法来解决这个问题:

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

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

于 2012-12-13T16:17:22.623 回答