Обработчик запроса на редактирование заявки на доставку
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 у ключа грузов запрещён). Затем помечаем на удаление старые грузы, говорим модели, что она была модифицирована и сохраняем изменения. Старые грузы удаляются, новые добавляются и всё работает как и ожидается.
Согласен, что не самое элегантное решение, буду рад любым комментариям по данному вопросу и его решению.