ADO.NETエンティティモデルで外部キーにアクセスする方法は?
-
03-07-2019 - |
質問
3つのテーブル(およびエンティティモデルの対応するエンティティ)があります ゲーム: Id-primayキー ...その他の列
プレーヤー: Id-主キー ...その他の列
GamePlayer(プレーヤーは多くのゲームに参加できます) GameId->ゲームからの外部キー PlayerId-> Playerからの外部キー ...その他の列
コードでは、他の方法でgameIdとplayerIdを使用できます。これを使用して、プレーヤー(playerId)が特定のゲーム(gameId)に参加しているかどうかを知りたいです。だから私はこれをやっています:(エンティティは私のコンテキストオブジェクトです)
IQueryable query = entities.GamePlayer.where(gp =>((gp.Game.Id == gameId)&&(gp.Player.Id == playerId))) クエリが行を返す場合、プレーヤーがそのゲームに参加していることがわかります。
エンティティ参照に関する複数のMSDNブログを読みましたが、混乱しています。 MSDNでは、まずIsLoadedのEntityReferenceオブジェクトをチェックする必要があり、ロードされていない場合はエンティティをロードする必要があり、クエリでそれを使用する必要があることを推奨しているようです。
GamePlayerにはGamePlayer.GameReferenceとGamePlayer.PlayerReferenceがありますが、GamePlayerオブジェクトが手元にないため、参照が読み込まれているかどうかを確認できません。 GamePlayerテーブルは、2つの1 ... *関係を保持し、それについてのものです。 GameIdとPlayerIdのみを使用してGamePlayerをクエリする必要があります。ここで何が間違っていますか?
代わりにPlayer(またはGame)オブジェクト(IDを使用)を取得し、代わりにGamePlayerエンティティコレクションを確認する必要がありますか? SQLはとてもシンプルでした。これがあまりにも素朴な場合は、申し訳ありませんが、SQLクエリをエンティティクエリに変換するのは大変です。
解決
あなたがやっていることは大丈夫だと思います。私の知る限り、lambda-expressionで使用するものはすべて明示的にロードする必要はありません。
MSDNが言及しているのは、GamePlayerエンティティを取得してから、次のような関連するエンティティにアクセスする場合です。
GamePlayer gp = entities.GamePlayer.First(g => g.id = 2);
string gameName = gp.Game.name;
それは例外をスローします(ゲームを個別にロードするか、次のようにロードする必要があります:entities.GamePlayer.Include(" Game")。First(g => g.id = 2 ))