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

Заранее спасибо каждому кто откликнется на мой вопрос. Суть такая - есть очень сложная модель, описывающая заявку на доставку груза (делаем внутренний логистический сервис - Web API 2 + AngularJS + Angular Material + Google Maps).
Заявка содержит одну точку отправления, один автомобиль и несколько грузов. Каждый груз в свою очередь содержит несколько точек назначения.
Схема БД 1c732894af204304b5e86c620b2980cb.png
Вопрос - каким образом реализовать редактирование этой самой заявки?
Заранее благодарю за ответы!
  • Вопрос задан
  • 558 просмотров
Решения вопроса 1
@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 у ключа грузов запрещён). Затем помечаем на удаление старые грузы, говорим модели, что она была модифицирована и сохраняем изменения. Старые грузы удаляются, новые добавляются и всё работает как и ожидается.

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

Войдите, чтобы написать ответ

Похожие вопросы