1

最近、プロジェクトを 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 部分も省略しました。失敗しているコード行は、その旨を示すコメントで示されます。

私はコードを複数回実行し、それを確認しました

  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