У меня есть два класса сущностей, которые выглядят так:
public class VendorLocation
{
//Primary Key
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public Vendor Vendor { get; set; }
//Location address
public string Address { get; set; }
}
public class Vendor
{
//Primary Key
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
//List of locations for this vendor
public List<VendorLocation> Locations { get; set; }
}
Как видите, существует отношение один ко многим, так что у продавца может быть много мест. У меня есть веб-форма, которая содержит список мест для одного Vendor
. Когда пользователь отправляет страницу, он отправляет весь список местоположений на Controller
. Контроллер выполняет некоторую логику для отображения ViewModel в список VendorLocation
. Мой сервисный уровень отвечает за синхронизацию обновленного списка местоположений у поставщика:
public async Task<Entities.Vendor> SetVendorLocationsAsync(Entities.Vendor vendor, List<Entities.VendorLocation> locations)
{
//Input locations should already have an ID if they are existing in the DB, so we can simple sync the whole list here
vendor.Locations = locations;
await _repository.UpdateAsync(vendor);
return vendor;
}
Код UpdateAsync
выглядит следующим образом:
/**
* Save an updated model to persistence
*/
public async Task UpdateAsync(TEntity model)
{
_context.Update(model);
await _context.SaveChangesAsync();
}
В приведенном выше коде каждый VendorLocation
будет иметь Id
, установленный на существующий Id
в базе данных, если пользователь обновил местоположение. Любые новые местоположения будут иметь Id
ноль.
В соответствии с документацией ( EF Core - отключенные объекты ) говорится следующее:
С автоматически генерируемыми ключами, обновление может снова использоваться для обеих вставок
и обновления, даже если график содержит набор объектов, которые требуют
вставка и те, которые требуют обновления.
Однако я получаю исключение:
MySqlException: Duplicate entry '3' for key 'PRIMARY'
В вышеупомянутой документации конкретно сказано:
Обновление помечает любую сущность на графике, в блоге или посте для вставки
если он не имеет установленного значения ключа, в то время как все остальные объекты
помечен для обновления.
Я бы предположил, поскольку мой объект уже имеет Id
, что EF Core будет отмечать его как обновление. Почему он пытается вставить снова? Я что-то здесь неправильно понимаю?