Каскадное удаление в службах данных WCF - PullRequest
2 голосов
/ 06 августа 2010

Можно ли удалить граф постоянных объектов одной командой, используя WCF Data Services в 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
Content-Type: multipart/mixed; boundary=changeset_b451aecf-b66d-4f0f-8e6d-8a067646b350

--changeset_b451aecf-b66d-4f0f-8e6d-8a067646b350
Content-Type: application/http
Content-Transfer-Encoding: binary

DELETE 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
Content-Type: multipart/mixed; boundary=changesetresponse_41e6e873-a5dd-446d-bda0-99405ba92a63

--changesetresponse_41e6e873-a5dd-446d-bda0-99405ba92a63
Content-Type: application/http
Content-Transfer-Encoding: binary

HTTP/1.1 500 Internal Server Error
Content-ID: 90
Cache-Control: no-cache
DataServiceVersion: 1.0;
Content-Type: application/xml

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code></code>
  <message xml:lang="uk-UA">An error occurred while processing this request.</message>
</error>
--changesetresponse_41e6e873-a5dd-446d-bda0-99405ba92a63--
--batchresponse_b6c22c24-17ec-409b-ba91-91784116927d--

Я также пытался установить для свойства OnDelete отношения значение Каскад в .edmx

Можно ли сделать такие удаления?Кто должен позаботиться об удалении указанных объектов: клиент или сервер?И сколько запросов на удаление должно быть отправлено на сервер: один или N + 1 (где N - количество деталей данного заказа).Может быть, я упускаю какой-то ключевой момент.Существуют ли учебники WCF Data Services, описывающие удаление графов объектов?

1 Ответ

3 голосов
/ 23 ноября 2010

YAY! Я понял это! = D Я сегодня был в одном и том же часах!

Так что я не установил Cascade в edmx.

Вы устанавливаете его в базе данных

В SQL Server Management Studio:

  1. На диаграмме базы данных выберите отношение, которое вы хотите каскадно удалить
  2. Открыть свойства
  3. Развернуть Вставить и обновить
  4. Установите для правила удаления значение Каскад.

Перезагрузка / обновление модели вашей сущности. Когда вы сделаете это, Visual Studio обновит CSDL / SSDL (что угодно?).

Ссылка от MSDN :
"Если вы хотите автоматически удалить все дочерние записи родителя при удалении родительской записи, вы можете указать правило каскадного удаления. Настоятельно рекомендуется указать каскадные правила удаления в как концептуальная модель, так и база данных . "

...