Как добраться до внешних ключей в модели объекта ADO.NET?
-
03-07-2019 - |
Вопрос
У меня есть 3 таблицы (и соответствующие объекты в модели объекта):ID - Primay Key ...другие столбцы
Игрок:ID - Первичный ключ ...другие столбцы
Геймплейер (игрок может участвовать во многих играх) -> Иностранный ключ из Game PlayerId -> Иностранный ключ от Player ...другие столбцы
В моем коде у меня есть gameId и playerId, доступные мне другими способами.Используя это, я хочу знать, участвует ли игрок (playerId) в определенной игре (gameId).Итак, я делаю это:(сущности — мой объект контекста)
Iqueryable Query = entities.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-запрос в запросы сущностей.
Решение
Я думаю, то, что ты делаешь, это нормально.Насколько я знаю, все, что вы используете в лямбда-выражении, не обязательно загружать явно.
Я думаю, что MSDN имеет в виду, если вы получите объект GamePlayer, а затем получите доступ к связанному объекту следующим образом:
GamePlayer gp =entities.GamePlayer.First(g=> g.id = 2);
строка gameName = gp.Game.name;
Это вызовет исключение (вам придется либо загрузить игру отдельно, либо убедиться, что она загружена следующим образом:юридические лица.GamePlayer.Include("Игра").First( g => g.id = 2))