Как добавить / обновить отношения многие ко многим с одним концом объекта в ядре EF - PullRequest
0 голосов
/ 11 января 2020

Мы посетили довольно много ссылок на EF Core, многие из которых были обновлены, но не смогли найти конкретный ответ на наш вопрос и прояснить наше понимание.

Сценарий: Мы добавим / обновим sh сущность и связанные с ней отношения многие ко многим в одном go подобном (dbset.Add () или dbset.Update ())

Мы пробовали следующее и могли только добавлять / обновлять родительский объект, а не список отношений «многие ко многим». Можете ли вы помочь нам узнать, где мы не правы? и что можно сделать?

Структура текущей модели:


        public class Teacher
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity), Required]
        public long Id { get; set; }
        public string Name { get; set; }
        public List<TeacherDuty> TeacherDuties { get; set; }
    }
    public class Duty
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity), Required]
        public long Id { get; set; }
        public string Description { get; set; }
        public List<TeacherDuty> TeacherDuties { get; set; }
    }
    public class TeacherDuty
    {
        public long TeacherId { get; set; }
        public Teacher Teacher { get; set; }

        public long DutyId { get; set; }
        public Duty Duty { get; set; }
    }

И мы пытаемся добавить / обновить, используя следующие методы:

public async Task<Teacher> AddTeacher(Teacher pTeacher)
{
    try
    {
        return await _teacher.AddAsync(pTeacher);
    }
    catch (Exception ex) { throw ex; }
}

public async Task<Teacher> UpdateTeacher(Teacher pTeacher)
{
    try
    {
        return await _teacher.Update(pTeacher);
    }
    catch (Exception ex) { throw ex; }
}

Пожалуйста, укажите нам наша неправильная интерпретация концепции и решения, если это возможно. Спасибо.

1 Ответ

1 голос
/ 13 января 2020

Я создаю демо для добавления и редактирования учителя. (_context - это контекст базы данных)

Добавление учителя:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Teacher teacher)
    {
        //get your desired dutyId with your own logic
        var SelectedDutyIds = new int[] { 1 };
        var teacherDuties = new List<TeacherDuty>();

        if (ModelState.IsValid)
        {
            _context.Add(teacher);
            await _context.SaveChangesAsync();


            foreach (var id in SelectedDutyIds)
            {
                var item = new TeacherDuty()
                {
                    TeacherId = teacher.Id,
                    DutyId = id,
                };
                teacherDuties.Add(item);
            }
            _context.AddRange(teacherDuties);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(teacher);
    }

Отредактируйте учителя: сначала удалите все существующие TeacherDuties учителя, а затем добавьте новых.

 [HttpPost]
 [ValidateAntiForgeryToken]
 public async Task<IActionResult> Edit(long id, Teacher teacher)
    {
        if (id != teacher.Id)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
               //your new dutyIds
                var newSelectedDutyIds = new int[] { 3 };
                var teacherDuties = new List<TeacherDuty>();


                var tdList = await _context.TeacherDuties.Where(td => td.TeacherId == teacher.Id).ToListAsync() ;
                _context.RemoveRange(tdList);

                foreach (var newid in newSelectedDutyIds)
                {
                    var item = new TeacherDuty()
                    {
                        TeacherId = teacher.Id,
                        DutyId = newid,
                    };
                    teacherDuties.Add(item);
                }
                _context.AddRange(teacherDuties);
                _context.Update(teacher);

                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TeacherExists(teacher.Id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction(nameof(Index));
        }
        return View(teacher);
    }

См. Обновление ядра структуры сущностей от многих ко многим

...