Как добраться до внешних ключей в модели сущностей 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))