4

我已经向三个程序员展示了这个问题,我们都被难住了。我在 foreach 循环中调用 Sql Server 存储过程,结果始终与第一次调用相同。即使我对参数进行硬编码(删除循环),也只会将第一个结果分配给所有后续调用。

存储过程由实体框架函数导入调用(EF4 数据库首先使用设计器)。调用代码位于作为类库的存储库中。该存储库由一个单独的 Asp.net webforms 项目调用。问题代码如下所示:

IEnumerable<WorkOrder> orders = _context.GetWorkOrders(UserName, workOrder, customerCode).ToList();

OrderStatus lastStatus = new OrderStatus();

foreach (Order order in orders)
{
     lastStatus = _context.GetOrderStatus(order.OrderNumber).FirstOrDefault();
     order.LastOrderStatus = lastStatus.OrderStatus;
}

正如你所看到的,这是非常基本的东西。根据传入的订单号,我总是得到循环中第一个订单号的结果。我已经关闭了 Ajax(我使用的 Telerik 控件的一部分),因为这在过去给我造成了莫名其妙的错误。我真的希望您能提出一种调试此问题的方法!提前致谢。

编辑: Daniel JG 的评论让我想到了这个可能的解决方案。现在我需要弄清楚如何应用 Ladislav Mrnka 的答案......“尝试使用 MergeOption.OverwriteChanges 直接调用 ExecuteFunction。”

4

2 回答 2

2

我正在回答我自己的问题(因为几天后没有其他人回答)。该问题是由实体框架数据库的第一个设计者引起的。它生成的代码会缓存第一个存储过程结果,从而导致后续调用中的错误结果。

正如我在对我的问题的编辑中提到的,修复涉及替换 ExecuteFunction 使用的默认 MergeOption 参数。您需要使用 MergeOption.OverwriteChanges 而不是默认值(我相信是 MergeOption.PreserveChanges)。

可以在生成的代码中更改该参数,但每次重新构建设计器时您的更改都会丢失。相反,我只是将生成的代码复制到我的存储库类,将 MergeOption 更改为 OverwriteChanges,然后停止使用生成的代码。最终结果如下所示:

IEnumerable<WorkOrder> orders = _context.GetWorkOrders(UserName, workOrder, customerCode).ToList();

OrderStatus lastStatus = new OrderStatus();

foreach (Order order in orders)
{

    ObjectParameter workOrderParameter;
    if (wo.WorkOrder != null)
    {
        workOrderParameter = new ObjectParameter("WorkOrder", order.WorkOrder);
    }
    else
    {
       workOrderParameter = new ObjectParameter("WorkOrder", typeof(global::System.String));
    }

    lastStatus = _context.ExecuteFunction<OrderStatus>("GetOrderStatus", MergeOption.OverwriteChanges, workOrderParameter).FirstOrDefault();

    if (status != null)
    {
        order.LastOrderStatus = status.OrderStatus;
    }
}

我还看到有一种方法可以修改 T4 模板以使生成的代码使用正确的 MergeOption 参数。我还没有尝试过。如果你有兴趣看看这里

于 2013-06-10T19:36:22.633 回答
1

我回来了对我自己的问题的第二个答案。确保实体密钥确实是每个实体的唯一标识符!

在我的例子中,OrderStock 实体缺少 OrderID(连同 StockID)作为实体键。通常,设计人员会从数据库中剔除主键字段,但我有一个独特的情况(我的实体基于视图)。由于我从实体键中删除了 OrderID,因此我看到单个 OrderStock 实体的重复行。

当我标记 OrderIDEntity Key = True时,重复的问题就消失了。

于 2013-06-28T15:21:24.027 回答