Опрос EF Core «один-ко-многим» и дальнейшие отношения «один-ко-многим» - PullRequest
0 голосов
/ 13 января 2019

У меня 3 модели, Competition, Team и TeamUser. В каждом соревновании много команд, а в каждой команде много пользователей. Я хочу использовать EF Core, чтобы связать все 3 вместе при возврате данных в представление, но я не могу связать пользователей. Таким образом, я должен реализовать некоторую сложную логику на мой взгляд, которая, хотя она работает, выглядит супер грязно и запутанно. Я уверен, что есть способ вернуть данные вместе.

Competition модель класса:

public class Competition
{
    [Key]
    public int ID { get; set; }
    [Required]
    [Display(Name = "Competition Name")]
    public string CompetitionName { get; set; }
    [Required]
    public string Status { get; set; }

    public ICollection<Team> Teams { get; set; }
}   

Team модель класса:

public class Team
{
    [Key]
    public int TeamID { get; set; }

    [Required]
    [DisplayName("Team Name")]
    public string TeamName { get; set; }

    [ForeignKey("CompetitionID")]
    public int CompetitionID { get; set; }

    public ICollection<TeamUser> TeamUsers { get; set; }

}

TeamUser модель класса:

public class TeamUser
{
    [Key]
    public int TeamUserID { get; set; }

    [ForeignKey("TeamId")]
    public int TeamId { get; set; }
    public string UserId { get; set; }
}

Это мой контроллер.

public IActionResult Index()
{
     var competition = _context.Competitions
         .Include(c => c.Teams)
         .ToList();

     var teamUsers = _context.TeamUsers
         .ToList();

     if (competition == null)
     {
         return NotFound();
     }

     CompetitionIndexViewModel vm = new CompetitionIndexViewModel();
     vm.Competition = competition;
     vm.TeamUsers = teamUsers;

     return View(vm);
}

Как вы видите, это очень грязно, и мне приходится прибегать к использованию viewmodel, чтобы перезаписать мои данные. Надеюсь, что есть более простое решение. Большое спасибо!

1 Ответ

0 голосов
/ 13 января 2019

Вам не нужно использовать CompetitionIndexViewModel. Просто напишите ваш запрос следующим образом и передайте List<Competition> в View.

public IActionResult Index()
{
     List<Competition> competitions = _context.Competitions
         .Include(c => c.Teams).ThenInclude(t => t.TeamUsers)
         .ToList();

     return View(competitions);
}

Теперь в представлении у каждого Competition должен быть список Teams, а у каждого Team должен быть список TeamUsers.

...