我最近将一个项目从 VS2012 升级到 VS2013(它最初创建于 2010 年),并将对其中一个数据库提供程序(Pervasive.Data.Common、Pervasive.Data.SqlClient、Pervasive.Data.SqlClient.Entity)的引用升级到较新的 4.0 版本。在执行此操作时,之前工作的两行代码不再正确刷新其查询中的数据,这些查询位于 using 语句中,该语句位于每次调用的函数中,因此不应存在长寿命对象,包括上下文和实体对象(所有其他语句都正常工作。)有问题的代码行尝试从 po 表中提取单个采购订单标题元组,并从 po_dtl 表中提取单个采购订单明细行项目元组。放置上下文。
下面是代码的一部分,为了清楚起见,省略了函数的核心。我还省略了代码的 po_dtl 部分,因为确定要使用哪个 po_dtl 元组的查询很复杂,并且会使代码难以阅读。注释说明了失败的代码行。
我已经多次单步执行代码并验证了
- 上下文对象总是在语句的开头出现是全新的,没有被跟踪的实体
- poNum 的值(正在查找的 po 标头的 id)按预期更改
- 无论 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();
}
}