Как добраться до внешних ключей в модели сущностей ADO.NET? - PullRequest
2 голосов
/ 02 января 2009

У меня есть 3 таблицы (и соответствующие сущности в модели сущностей) Игра: Id - первичный ключ ... другие столбцы

Игрок: Id - первичный ключ ... другие столбцы

GamePlayer (игрок может участвовать во многих играх) GameId -> внешний ключ от Game PlayerId -> внешний ключ от Player ... другие столбцы

В моем коде у меня есть gameId и playerId, доступные через другие средства. Используя это, я хочу знать, участвует ли игрок (playerId) в определенной игре (gameId). Итак, я делаю это: (лица мой объект контекста)

IQueryable query = entity.GamePlayer.where (gp => ((gp.Game.Id == gameId) && (gp.Player.Id == playerId))) Если запрос возвращает строку, то я знаю, что игрок участвует в этой игре.

Я читаю несколько блогов MSDN по ссылкам на сущности, и я запутался Похоже, что MSDN рекомендует сначала проверить объект EntityReference на наличие IsLoaded и, если он не загружен, загрузить объект и ТОЛЬКО затем использовать его в запросе.

GamePlayer имеет GamePlayer.GameReference и GamePlayer.PlayerReference, но я не могу проверить, загружена ли ссылка, потому что у меня нет объекта GamePlayer в руке. Таблица GamePlayer содержит две взаимосвязи 1 ... * и все. Я должен запросить GamePlayer только используя GameId и PlayerId. Что я тут не так делаю?

Должен ли я вместо этого получить объект Player (или Game) (используя их идентификаторы) и вместо этого проверить коллекцию сущностей GamePlayer? Sql было так просто. Если это так наивно, извините, мне трудно перевести мой sql-запрос на запросы сущностей.

1 Ответ

1 голос
/ 06 февраля 2009

Я думаю, что вы делаете хорошо. Насколько я знаю, все, что вы используете в лямбда-выражении, не нужно загружать явно.

Я думаю, что MSDN имеет в виду, если вы получите объект GamePlayer, а затем получите доступ к ассоциированному объекту, например так:

GamePlayer gp = entity.GamePlayer.First (g => g.id = 2);

string gameName = gp.Game.name;

Это вызвало бы исключение (вам нужно было бы либо загрузить игру отдельно, либо убедиться, что она загружена так:

...