4

私は Entity Framework と LINQ を初めて使用し、かなり奇妙なシナリオに遭遇しました。

アカウント情報を返すために次のクエリを使用しています。

var account = ((from acct in _entities.Account
                        join m in _entities.Item on acct.Id equals m.Account.Id
                        where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber)
                        select acct) as ObjectQuery<Account>).Include("Item.ItemDetails");

最近、データベースにいくつかの変更を加え、新しい edmx ファイルを生成しました。変更後も、上記のクエリはアカウントと関連するアイテムを返しますが、ItemDetails は含まれなくなりました。

クエリによって返された SQL を検証しましたが、正しいデータが返されているため、問題はないようです。

さらに、Item オブジェクトと ItemDetails オブジェクトの間の edmx ファイルに違いはありません。これらは変更されておらず、ナビゲーション プロパティが存在するためです。

誰もこれを見たことがありますか?

ありがとう

4

2 に答える 2

1

次の 2 つのシナリオのいずれかが考えられます。

  1. Itemとの関係がありAccountます (Entity Model では EntityAssociation として、DB では外部キーとして表現されます):

  2. Itemset とsetの間には関係がないAccountため、LINQ で結合を指定する必要があります。

ケース 1: この場合、join ステートメントは必要ありませんAcount.ItemItem.AccountIDAccount.ID

したがって、結合ステートメント:join m in _entities.Item on acct.Id equals m.Account.Id は基本的に、ID を確認するためItemにループバックするように指示しています。Accountそれらがまだ接続されていない場合、取得できなかった可能性がありますm.Account.ID

Accountケース 2: と の間に関係がない場合、モデルにナビゲーション プロパティが存在しないため、 は確実に機能しませんItem.Include()

Account結論: 新しいモデルをチェックして、 と の間に関係が存在するかどうかを確認しますItem。はいの場合は、結合を削除します。関係がなければ、あなたは何か間違ったことをしました。

シナリオ 1 を想定した select ステートメントを次に示しますAccount.Item。これはコレクションではありません。

var account = from acct in _entities.Account.Include("Item.ItemDetails")
              where acct.Id == accountId && acct.Item.ItemNumber.EndsWith(itemNumber)
              select acct;
于 2010-02-28T09:59:54.830 に答える
1

Include(...) では、ナビゲーション プロパティの名前が使用されるため、.edmx からプロパティの正確な名前を確認することをお勧めします (特に単数形または複数形の場合)。

また、次のようにクエリを変更することもできます。

var account = from acct in _entities.Account.Include("Item.ItemDetails")
              join m in _entities.Item 
                  on acct.Id equals m.Account.Id
              where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber)
              select acct;
于 2010-01-25T17:00:34.300 に答える