Добавление данных в кросс-таблицу, созданную EF с помощью AutoMapper - PullRequest
0 голосов
/ 19 декабря 2018

Это мое первое отношение «многие ко многим», состоящее из Team , User и TeamUser объектов.В TeamController я сопоставил TeamForCreationDto с Team , но члены ICollection были пусты.Какая-то ошибка в CreateMap?

Q1: Как это должно быть объединено, чтобы заполнить все свойства и таблицы EF?Теперь у меня есть цикл «for» и там создан / добавлен TeamUser.

Q2: Если мне нужно заполнить оба свойства AdminId и Admin?
A2: Нет, после добавления Admin свойство AdminId в БД благодаря EF будетнайти значение автоматически.

public class Team
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int AdminId { get; set; }
    public User Admin { get; set; }
    //public int[] MembersId { get; set; }
    public ICollection<TeamUser> Members { get; set; }
}
public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public ICollection<Team> TeamsAsAdmin { get; set; }
    public ICollection<TeamUser> TeamsAsMember { get; set; }
}
public class TeamUser
{
    public int TeamId { get; set; }
    public Team Team { get; set; }
    public int UserId { get; set; }
    public User User { get; set; }
}

Отношения между таблицами в ModelBuilder

builder.Entity<Team>()
    .HasOne(t => t.Admin)
    .WithMany(u => u.TeamsAsAdmin)
    .OnDelete(DeleteBehavior.Restrict);

builder.Entity<TeamUser>()
    .HasKey(tu => new { tu.TeamId, tu.UserId });

builder.Entity<TeamUser>()
    .HasOne(tu => tu.User)
    .WithMany(u => u.TeamsAsMember)
    .HasForeignKey(tu => tu.UserId)
    .OnDelete(DeleteBehavior.Cascade);

builder.Entity<TeamUser>()
    .HasOne(tu => tu.Team)
    .WithMany(t => t.Members)
    .HasForeignKey(tu => tu.TeamId);

My CreateMap в AutoMapperProfiles ()

CreateMap<TeamForCreationDto, Team>().ReverseMap().ForMember(u => u.MembersId, opt => opt.MapFrom(x => x.Members));

My TeamController.cs

    public async Task<IActionResult> Create(int userId, TeamForCreationDto teamForCreationDto)
    {

        if (await _repoTeams.TeamExists(teamForCreationDto.Name))
            return BadRequest("A team with this name already exists!");
        var mappedTeam = _mapper.Map<Team>(teamForCreationDto);
        //mappedTeam.AdminId = userId;
        mappedTeam.Admin = await _repoUsers.GetUser(userId);
        _repoTeams.Add(mappedTeam);
        for (int i = 0; i < teamForCreationDto.MembersId.Length; i++)
        {
            TeamUser tm = new TeamUser();
            tm.Team = mappedTeam;
            tm.User = await _repoUsers.GetUser(teamForCreationDto.MembersId[i]);
            _repoTeams.Add(tm);
        }
        await _repoTeams.SaveAll();
    }

TeamForCreationDto.cs

public class TeamForCreationDto
    {
        int Id { get; set; }
        public string Name { get; set; }
        public string PhotoUrl { get; set; }
        public int[] MembersId { get; set; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...