Как обновить существующий объект во многих отношениях (.Net 5)

Я использовал.Net 5 и EF Core 5 для небольшого веб-приложения. Учитывая, что EF Core 5 поддерживает многие-многие из коробки, нет необходимости в объединяющей таблице.

Я столкнулся с проблемой при обновлении объекта, который уже существует в БД. Для моего приложения у меня есть спортсмены и родители, у которых много-много отношений.

    public class Athlete
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
        public string Email { get; set; }
        public string ContactNumber { get; set; }
        public string Street { get; set; }
        public int Postcode { get; set; }
        public string City { get; set; }
        public StateEnum State { get; set; }
        public DateTime DateofBirth { get; set; }
        public DateTime DateSignedUp {get; set;}
        public virtual ICollection<Parent> Parents { get; set; }
    }
public class Parent
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
        public string Email { get; set; }
        public string ContactNumber { get; set; }
        public string Street { get; set; }
        public int Postcode { get; set; }
        public string City { get; set; }
        public StateEnum State { get; set; }
        public DateTime DateofBirth { get; set; }
        public DateTime DateSignedUp {get; set;}
        public virtual ICollection<Athlete> Athletes { get; set; }
    }

Когда я пытаюсь обновить существующего спортсмена, который связан с двумя другими родителями, я получаю сообщение об ошибке: нарушение ограничения PRIMARY KEY "PK_AthleteParent". Невозможно вставить повторяющийся ключ в объект dbo.AthleteParent. Повторяющееся значение ключа: (31, 1)

[HttpPost]
public async Task<ActionResult<Athlete>> PostAthlete(Athlete athlete)
{
     _context.Athletes.Update(athlete);
     await _context.SaveChangesAsync();
     return Ok(athlete));
}

Из того, что я могу сказать, когда объект пытается обновить моего спортсмена, он пытается вставить новые строки в объединяющую таблицу, даже если родительские элементы там уже существуют. Есть ли способ заставить объект удалить какие-либо записи при обновлении отношения? Или есть способ сообщить объекту, что нужно обновить присоединяемую таблицу, чтобы она соответствовала переданному объекту Athlete?

благодаря

1 ответ

Учитывая простой пример, подобный этому:

      public class Foo {
    Guid Id { get; set; }
    ICollection<Bar> Bars { get; set; }
}

public class Bar {
    Guid Id { get; set; }
    ICollection<Foo> Foos { get; set; }
}

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

      var foo = context.Foos.Include(x => x.Bars).FirstOrDefault(x => x.Id == someGuid);
foo.Bars.Clear();
foo.Bars.Add(bar1);
foo.Bars.Add(bar2);
...
context.Update(foo);
context.SaveChanges();
Другие вопросы по тегам