1

MyItems というエンティティのテーブルがあり、このテーブルの各アイテムには別のテーブルへの外部キーがあります。次のように、アイテムを単純にループして、各アイテムの外部キー オブジェクトの文字列 'Name' プロパティにアクセスしたいと思います。

foreach (var myItem in (from q in context.MyItems select q))
{
   string testName = myItem.ForeignItem.Name
}

これを行うと、ForeignItem が null になり、ForeignItem にアクセスしようとすると InvalidOperationException が発生します。

このコマンドに関連付けられた開いている DataReader が既に存在し、最初に閉じる必要があります。

ただし、代わりに ToList() を次のように呼び出すと:

(from q in context.MyItems select q).ToList()

私の外部キーオブジェクトは問題なく入力されます。テーブル全体を一度に取得するため、ToList() のコストが高くなることがわかりました。遅延読み込みの裏で何かがおかしいのではないかと思いますが、を呼び出さなくても動くはずだToList()という理解で取り組んでいます。

私は何かを見落としましたか?

編集:varおそらくの使用が問題を引き起こしていると思っていたので、使用してみました

foreach (MyItem myItem in (from q in context.MyItems select q))
{
   // loop contents
}

代わりに - 同じ結果。myItemnull のままである外部キー オブジェクトを除いて、のプロパティが設定されます。

編集 #2:アプリケーション全体で 1 つのオブジェクト コンテキストと 1 つの Linq-to-Entities ステートメントしか使用しないため、この他の DataReader がどこで動作しているかを説明するのに途方に暮れています。また、このエラーはループ内の最初のオブジェクトで発生するため、前のアイテムが取得された結果ではないことに注意してください。

4

2 に答える 2

5

myItemの代わりに書きましたq。これを使用する必要があります:

(from q in context.MyItems select q)

または、もっと簡単に、次のように書くこともできます。

context.MyItems

更新された質問に関しては、最初のクエリの実行が完了する前に新しいクエリを開始したためと思われます。可能な解決策:

  • 元のクエリを実行するときに、子アイテムを含めます。

    foreach (var myItem in context.MyItems.Include("ForeignItem")) { ... }
    
  • MultipleActiveResultSets を有効にします。

関連している

于 2012-08-08T18:28:41.620 に答える
0

Include( )を使用するというマークの提案に従って、私が最終的に行ったことは次のとおりです。

(from q in context.MyItems.Include("ForeignItemOne").Include("ForeignItemTwo").Include("ForeignItemThree") select q)

ちなみに、MultipleActiveResultSetstrue に設定しても機能します。Include()ここでは、アプリケーションが小さく、Linq ステートメントが 1 つしかないため、これを使用します。

于 2012-08-08T19:23:15.757 に答える