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

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

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

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

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

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 ответ

Решение

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

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

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

строка gameName = gp.Game.name;

Это вызвало бы исключение (вам нужно было бы либо загрузить игру отдельно, либо убедиться, что она загружена следующим образом: entity.GamePlayer.Include("Game").First( g => g.id = 2))

Другие вопросы по тегам