Чтобы обработать случай, когда вы хотите удалить элемент из контекста, вам нужно отсоединить его от DbContext, а не вызывать Remove
. Remove
может привести к нежелательным последствиям, таким как удаление существующей строки.
Так что в вашем случае вызов SaveOrder должен работать следующим образом:
public void SaveOrder(Order order)
{
try
{
_context.Orders.Add(order);
_context.SaveChanges();
}
catch (DbUpdateException ex)
{
_context.Entry(order).State = EntityState.Detached; // De-associate from the poisoned order.
// TODO: Consider logging that this order could not be saved or returning a result to that effect.
}
}
Обратите внимание, что если и У сущности заказа есть дочерние элементы, которые были добавлены / обновлены как часть этой операции, вам также необходимо их отсоединить. Т.е.
catch (DbUpdateException ex)
{
_context.Entry(order).State = EntityState.Detached;
foreach(var orderLine in order.OrderLines)
{
_context.Entry(orderLine).State = EntityState.Detached;
}
}
Только для строк, которые были добавлены или иным образом обновлены операцией. Вы не хотели бы отсоединять Order.Customer, если запись о клиенте не была создана / обновлена с помощью этой операции.
Я предпочитаю использовать шаблоны единиц работы, которые будут видеть вставку нового заказа как одну операцию, включающую единица работы. Если я создаю 5 заказов, каждый из которых не зависит друг от друга (1 сбой не влияет на остальные), то это 5 отдельных операций. Раскрутка области видимости DbContext обычно является наиболее безопасным вариантом, чтобы избежать перекрестного «отравления» и не требует значительных затрат. Для операций, которые касаются одних и тех же данных, существуют дополнительные расходы на чтение, хотя они обычно выбираются по сценарию идентификатора ios (Customer By Id, Products By Id и т. Д. c.), Поэтому они имеют низкую стоимость. Чрезмерная путаница с подключенным и отключенным состоянием вокруг заказов может привести к более серьезным проблемам, так как после вызова Save ссылка «заказ» может или не может быть отслеживаемой сущностью.