4

Я изучаю Core Entity Framework и начинаю с использования первого подхода кода при чтении этого руководства https://docs.efproject.net/en/latest/platforms/aspnetcore/new-db.html, за исключением разных моделей.Как загрузить связанные объекты с помощью платформы Entity Framework Core

В EF6 у него была ленивая загрузка, и я смог легко потянуть связанные объекты, но в EF Core он не работает. Мне было интересно, как это сделать, или если есть работа, чтобы заставить ее работать.

Вот пример того, что два моих моделей выглядит следующим образом:

public class Team 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Icon { get; set; } 
    public string Mascot { get; set; } 
    public string Conference { get; set; } 
    public int NationalRank { get; set; } 

    public List<Game> Games { get; set; } 
} 

public class Game 
{ 
    public string Id { get; set; } 
    public string Opponent { get; set; } 
    public string OpponentLogo { get; set; } 
    public string GameDate { get; set; } 
    public string GameTime { get; set; } 
    public string TvNetwork { get; set; } 
    public string TeamId { get; set; } 

    public Team Team { get; set; } 
} 

Я желающей получить все игры для команды, но по состоянию на сейчас она равна нулю.

Я решил создать проект Web Api, поэтому у меня есть контроллер под названием TeamsController, и когда я делаю запрос GET контроллеру, я хочу получить список команд с имуществом Games, связанным с играми.

Вот что я пробовал:

[HttpGet] 
public async Task<List<Team>> Get() 
{ 
    return await _context.Teams.Include(t => t.Games).ToListAsync(); 
} 

Это результат JSON:

[ 
    { 
    "id": "007b4f09-d4da-4040-be3a-8e45fc0a572b", 
    "name": "New Mexico", 
    "icon": "lobos.jpg", 
    "mascot": "New Mexico Lobos", 
    "conference": "MW - Mountain", 
    "nationalRank": null, 
    "games": [ 
     { 
     "id": "1198e6b1-e8ab-48ab-a63f-e86421126361", 
     "opponent": "vs Air Force*", 
     "opponentLogo": "falcons.jpg", 
     "gameDate": "Sat, Oct 15", 
     "gameTime": "TBD ", 
     "tvNetwork": null, 
     "teamId": "007b4f09-d4da-4040-be3a-8e45fc0a572b" 
     } 
    ] 
    } 
] 

Когда я делаю это:

[HttpGet] 
public async Task<List<Team>> Get() 
{ 
    return await _context.Teams.ToListAsync(); 
} 

я все команды, но свойство Games равно null.

Я надеялся, что он вернет все команды в базе данных вместе со всеми играми для каждой команды. Как я могу заставить это работать?

+2

Согласно [this] (https://docs.efproject.net/en/latest/querying/related-data.html), ленивая загрузка еще не реализована. – Michael

+2

Также имейте в виду, что ленивая загрузка может вызвать проблемы с производительностью, в зависимости от того, сколько команд у вас будет. При ленивой загрузке у вас будет '1 + n = <вызовы в базу данных>' где 'n' - количество команд в базе данных. – Michael

+0

@Michael В разделе «Забытая загрузка» в статье говорится, что вы можете использовать .Include(), который я пробовал, но по какой-то причине он возвращает только первую команду и первую игру первой команды. Как показано на выходе json. Вы случайно не знаете, почему он не получает все результаты? – Aaron

ответ

2

В настоящее время Lazy-загрузка не реализована в ядре каркаса сущности как indicated here. Предлагаю вам взглянуть на AutoMapper, чтобы запрограммировать желаемые результаты в POCO. Потому что то, что вы хотите, точно вызовет проблему n + 1.

Смежные вопросы