Как синхронизировать список связанных объектов .NET EF Core - PullRequest
0 голосов
/ 17 мая 2018

У меня есть два класса сущностей, которые выглядят так:

  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 будет отмечать его как обновление. Почему он пытается вставить снова? Я что-то здесь неправильно понимаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...