• Entity Framework 6 обновление сложной модели - как?

    @artofdev Автор вопроса
    Обработчик запроса на редактирование заявки на доставку
    public async Task<IHttpActionResult> EditDeliveryBidAsync(long id, EditBid bid)
            {
                var dbBid = await DeliveryManager.GetBidAsync(id);
                if (dbBid != null)
                {
                    var oldCargoIds = dbBid.Cargos.Select(c => c.Id).ToArray();
                    Mapper.Map(bid, dbBid);
                    if (await DeliveryManager.UpdateBidAsync(dbBid, oldCargoIds))
                        return Ok();
                }
                return BadRequest();
            }

    Менеджер, отвечающий за работу с заявками
    public async Task<bool> UpdateBidAsync(DeliveryBid bid, long[] oldCargoIds)
            {
                DbContext.Entry(bid).State = EntityState.Modified;
                await DbContext.DeliveryCargos.ForEachAsync(c =>
                {
                    if (oldCargoIds.Any(o => o == c.Id))
                        DbContext.DeliveryCargos.Remove(c);
                });
                var updatedBid = await DbContext.SaveChangesAsync();
                return updatedBid > 0;
            }


    В обработчике мы получаем Id'шники всех грузов, которые уже привязаны к заявке, затем маппим ViewМодель на объект базы данных. Далее вызываем менеджера, отвечающего за работу с заявками в базе данных, передав ему новую модель и Id'шники старых грузов (которые необходимо удалить, т.к. Null у ключа грузов запрещён). Затем помечаем на удаление старые грузы, говорим модели, что она была модифицирована и сохраняем изменения. Старые грузы удаляются, новые добавляются и всё работает как и ожидается.

    Согласен, что не самое элегантное решение, буду рад любым комментариям по данному вопросу и его решению.
    Ответ написан
    Комментировать