Обновление кросс-модели в ASP. NET Core - PullRequest
0 голосов
/ 18 февраля 2020

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

У меня есть 2 модели, Teacher и Student. Отношения - это один учитель для многих учеников. Это бэкэнд-проект API, и я работаю над методом PUT, который может обновлять поля в обеих моделях одновременно в одном запросе.

Вот мой класс Teacher:

public partial class Teacher
{
        public Teacher()
        {
            Students = new HashSet<Student>();            
        }

        public int TeacherId { get; set; }
        public string Name { get; set; }
        ... tons of other properties ...
}    

Вот мой Student класс:

public partial class Student
{       
        public int Id { get; set; }
        public int TeacherId { get; set; }
        public string Name { get; set; }
        public virtual Teacher Teacher { get; set; }        
}

Вот контроллер:

[HttpPut("{id}")]
public async Task<IActionResult> PutTeachers(int id, TeacherViewModel model)
{            
    var result = await _service.UpdateAsync(model);          
    return Ok(result.Message);
}

(приведенный выше код упрощен) - принимает значение TeacherViewModel, которое ограничивает количество возвращаемых полей - Я использовал другой класс в качестве службы для обновления

Вот класс обслуживания:

public class TeacherService
{
        private readonly Repository<Teacher> _repository;        

        public TeacherService(DatabaseContextWrapper context)
        {
            _repository = new Repository<Teacher>(context);            
        }

        public async Task<ITransactionResult> UpdateAsync(TeacherViewModel model)
        {
            var teacher = _repository.FindAsync(model.TeacherId).Result;

            teacher.TeacherId = model.TeacherId;
            teacher.Name = model.Name;           

            teacher.Students.Clear();

            foreach(var student in model.Students)
            {
                teacher.Students
                    .Add(new Student
                    {
                        Id = Student.Id,
                        TeacherId = Student.TeacherId
                        Name = Student.Name
                    });```
            }
        }
}

Я считаю, что нужно добавить модель Student к ученикам в соответствии с Teacher модель, но она не повторяется. Если я закомментирую чистый код, обновление будет работать, но оно не будет пересекаться. Это просто не будет повторяться. Я думаю, что я довольно потерян в этот момент. Буду признателен за любую помощь!

Редактировать 1 (Конфигурация отношений между сущностями)

 modelBuilder.Entity<Student>(entity =>           {                           
                entity.HasOne(d => d.Teacher)
                    .WithMany(p => p.Students)
                    .HasForeignKey(d => d.TeacherId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_Students_Teachers");
            });

Это моя конфигурация

1 Ответ

0 голосов
/ 18 февраля 2020

Попробуйте добавить обратную конфигурацию к вашей родительской сущности:

 modelBuilder.Entity<Teacher>(entity =>           
            {                           
                entity.HasMany(d => d.Students)
                    .WithOne(p => p.Teacher)
                    .HasForeignKey(d => d.TeacherId);
            });
...