最近、プロジェクトを VS2012 から VS2013 にアップグレードし (最初は 2010 年に作成されました)、データベース プロバイダーの 1 つ (Pervasive.Data.Common、Pervasive.Data.SqlClient、Pervasive.Data.SqlClient.Entity) への参照もアップグレードしました。新しい 4.0 バージョン。これを行うと、以前は機能していた 2 行のコードが、毎回呼び出される関数内にある 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();
}
}