Каскадное удаление в службах данных WCF
Можно ли удалить граф постоянных объектов одной командой, используя службы данных WCF в Silverlight? Я начал с этого пошагового руководства и добавил код для удаления выбранного заказа (который содержит детали):
private void deleteOrder_Click(object sender, RoutedEventArgs e)
{
Order deletedOrder = (Order)ordersGrid.SelectedItem;
// Delete the selected order.
svcContext.DeleteObject(deletedOrder);
// Remove the deleted order from the binding collection.
ordersGrid.SelectedIndex = ordersGrid.SelectedIndex == 0 ? 1 : ordersGrid.SelectedIndex - 1;
ordersBindingCollection.Remove(deletedOrder);
}
Когда я сохраняю изменения обратно на сервер, выдается запрос на удаление:
--batch_2009b119-0747-4019-8974-8ea7dd29963a Тип контента: составной / смешанный; граница =changeset_b451aecf-B66D-4f0f-8e6d-8a067646b350 --changeset_b451aecf-B66D-4f0f-8e6d-8a067646b350 Тип контента: приложение /http Content-Transfer-Encoding: двоичный УДАЛИТЬ http://localhost:55378/PurchasesService.svc/Orders(1) HTTP/1.1 Content-ID: 90 --changeset_b451aecf-B66D-4f0f-8e6d-8a067646b350-- --batch_2009b119-0747-4019-8974-8ea7dd29963a--
Но в конце базы данных происходит сбой с нарушением ограничения внешнего ключа:
--batchresponse_b6c22c24-17ec-409b-ba91-91784116927d Тип контента: составной / смешанный; граница =changesetresponse_41e6e873-a5dd-446d-bda0-99405ba92a63 --changesetresponse_41e6e873-a5dd-446d-bda0-99405ba92a63 Тип контента: приложение /http Content-Transfer-Encoding: двоичный HTTP/1.1 500 Внутренняя ошибка сервера Content-ID: 90 Cache-Control: без кеша DataServiceVersion: 1,0; Тип контента: application/xml xml version = "1.0" encoding = "utf-8" standalone = "yes"?><Код> код> Произошла ошибка при обработке этого запроса. message> Ошибка>--changesetresponse_41e6e873-a5dd-446d-bda0-99405ba92a63-- --batchresponse_b6c22c24-17ec-409b-ba91-91784116927d--
Я также пытался установить свойство OnDelete отношения в Cascade в.edmx
Можно ли сделать такие удаления? Кто должен позаботиться об удалении указанных объектов: клиент или сервер? И сколько запросов на удаление должно быть отправлено на сервер: один или N+1 (где N - количество деталей данного заказа). Может быть, я упускаю какой-то ключевой момент. Существуют ли учебники WCF Data Services, описывающие удаление графов объектов?
1 ответ
УРА! Я понял это! =D Я был в одном и том же часах сегодня!
Так что я не установил Каскад в EDMX.
Вы устанавливаете это в базе данных
В SQL Server Management Studio:
- В диаграмме базы данных выберите отношение, которое вы хотите каскадно удалить
- Открытые свойства
- Развернуть Вставить и обновить
- Установите для правила удаления значение Каскад.
Перезагрузите / Обновите модель вашей сущности. Когда вы сделаете это, Visual Studio обновит CSDL/SSDL (что бы то ни было?).
Ссылка от MSDN:
"Если вы хотите автоматически удалить все дочерние записи родителя при удалении родительской записи, вы можете указать правило каскадного удаления. Настоятельно рекомендуется указывать правила каскадного удаления как в концептуальной модели, так и в базе данных ".