Сначала я использую код структуры сущностей и открываю базу данных Northwind через интерфейс WCF REST HTTP.
Я не раскрыл таблицу OrderDetails (элементы заказа), так как не имеет смысла создавать заказ и затем добавлять каждый требуемый OrderDetail отдельно через другую службу. На мой взгляд, это должна быть атомарная транзакция, которая либо завершается успешно, либо терпит неудачу. Поэтому включаю Заказ.OrderDetails при передаче клиенту и предполагаю, что я получу его при создании или обновлении заказа.
Проблема, однако, заключается в обнаружении изменений в коллекции OrderDetails при повторном присоединении объекта Order для обновления. Сам порядок может быть изменен для обновления этих свойств, но это не каскадно для элементов OrderDetail. Таким образом, я могу вручную пройти и настроить обновленные на измененные, но проблема заключается в том, чтобы выяснить, какие из них обновляются в первую очередь. Установка нового OrderDetail на измененный вызовет ошибку при попытке сохранения.
Я прочитал рекомендацию установить для идентификатора новых элементов коллекции значение 0 и использовать его на сервере, чтобы решить, новый он или существующий. Однако Northwind использует составной ключ между OrderID и ProductID для OrderDetails. Они оба должны быть установлены клиентом, поэтому я не могу найти способ обнаружить что-то новое. Кроме того, удаленный OrderDetail не будет существовать в отдельном графе, и мне нужно будет выяснить, что было удалено, и явно удалить его.
Любой совет будет очень признателен.
public override Order Update(Order entity)
{
dbset.Attach(entity);
DataContext.Entry(entity).State = EntityState.Modified;
foreach (var orderDetail in entity.OrderDetails)
{
DataContext.Entry(orderDetail).State = EntityState.Modified;
}
return entity;
}