1

我最近将一个项目从 VS2012 升级到 VS2013(它最初创建于 2010 年),并将对其中一个数据库提供程序(Pervasive.Data.Common、Pervasive.Data.SqlClient、Pervasive.Data.SqlClient.Entity)的引用升级到较新的 4.0 版本。在执行此操作时,之前工作的两行代码不再正确刷新其查询中的数据,这些查询位于 using 语句中,该语句位于每次调用的函数中,因此不应存在长寿命对象,包括上下文和实体对象(所有其他语句都正常工作。)有问题的代码行尝试从 po 表中提取单个采购订单标题元组,并从 po_dtl 表中提取单个采购订单明细行项目元组。放置上下文。

下面是代码的一部分,为了清楚起见,省略了函数的核心。我还省略了代码的 po_dtl 部分,因为确定要使用哪个 po_dtl 元组的查询很复杂,并且会使代码难以阅读。注释说明了失败的代码行。

我已经多次单步执行代码并验证了

  1. 上下文对象总是在语句的开头出现是全新的,没有被跟踪的实体
  2. poNum 的值(正在查找的 po 标头的 id)按预期更改
  3. 无论 poNum 有什么值,第一次执行查询返回的 po 头总是由这行代码返回
public ReceivePieceInfo(AdvanceShippingNoticePiece item, int profitUserId, Inventory.Location receiveLocation, DateTime receiveDate, string tripNumber)
{
  // LinqContextMaster.NewProfitContext provides a brand new 
  //  context each time it is called
  using (Profit.ProfitDatabase pd = LinqContextMaster.NewProfitContext)
  {
    decimal poNum = decimal.Parse(item.PurchaseOrderNumber);
    decimal poLineNum = decimal.Parse(item.PurchaseOrderLineNumber);
    IEnumerable<Profit.po> profit_pos = null;

    // THIS IS THE BROKEN CODE - no matter what poNum is, this 
    //  query always returns the very first PO that was queried
    profit_pos = pd.po.Where(po => po.po_no == poNum);

    Profit.po profit_po = null;
    if (profit_pos.Count() == 1)
      profit_po = profit_pos.Single();
  }
}
4

0 回答 0