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
}
代わりに - 同じ結果。myItem
null のままである外部キー オブジェクトを除いて、のプロパティが設定されます。
編集 #2:アプリケーション全体で 1 つのオブジェクト コンテキストと 1 つの Linq-to-Entities ステートメントしか使用しないため、この他の DataReader がどこで動作しているかを説明するのに途方に暮れています。また、このエラーはループ内の最初のオブジェクトで発生するため、前のアイテムが取得された結果ではないことに注意してください。