Próbuję wdrożyć to, co uważałem za prosty scenariusz za pomocą usługi OData dostarczanej przez usługi danych WCF (przy użyciu formatu OData V3/json; odata = verbose payload, teraz mogę używać formatu JSON Light w przyszłość). Podstawowy scenariusz wygląda tak:Jak zaktualizować encję OData i zmodyfikować jej właściwości nawigacyjne w jednym żądaniu?
Mam dwa podmioty:
class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual PersonCategory Category { get; set; }
}
class PersonCategory
{
public int ID { get; set; }
public string Description { get; set; }
public virtual ICollection<Person> People { get; set; }
}
Teraz chcę utworzyć prostą stronę edycji dla danej osoby. Ta strona edycji może mieć dane wejściowe dla Nazwy oraz dane wejściowe lub listę rozwijaną dla kategorii Osoby.
Więc scenariusz idzie:
- Kod pobiera osoba korzystająca $ poszerzyć dla kategorii: GET /api.svc/People(1)?$expand=Category
- użytkownik edytuje zarówno osoby Nazwa własności i ich kategoria.
- Kod strony składa się z pojedynczego żądania aktualizacji właściwości tej osoby i kategorii.
Klucz jest tutaj w "pojedynczej prośbie". To jest część, z którą mam problem ze znalezieniem dokumentacji. Widziałem przykłady, w których dzielą liczbę 3 powyżej na dwie prośby. Coś takiego (nie pamiętam dokładnie formatu - Jestem też pewien, czy nie trzeba by usunąć linki Kategoria przed wykonaniem put):
PATCH /api.svc/People(1) with content: {"Name": "new name" }
PUT /api.svc/People(1)/$links/Category with content: { "url": "/api.svc/Categories(2)" }
Ale, ja też je słyszał powiedział, ale nie wykazał, że można zaimplementować niniejszĘ ... aktualizację jako pojedyncze żĘ ... danie ze zmianĘ ... w właś ciwoś ci nawigacji kategorii okreś lonej zgodnie z innymi zmianami do jednostki osoby. Czy ktoś mógłby mi podać przykład tego, jak można to zrobić? Czy możesz mi pokazać, jak można to zrobić za pomocą właściwości nawigacji "wiele do wielu", w przeciwieństwie do jednego z wielu, które opisałem powyżej.
I wreszcie, używam obecnie pełnego formatu JSON, V3. Czy twoje odpowiedzi na powyższe pytania będą inne, jeśli zamiast tego użyję nowego formatu światła JSON? Jeśli tak to jak?
Można wysłać wniosek wsadowy - byłby to pojedynczy wniosek zawierający obie operacje. – Pawel
Czy nie ma innego sposobu, aby zrobić to inaczej niż żądanie wsadowe? To by dodało dodatkowej złożoności do kodu rundy w obie strony po stronie klienta, którego wolałbym uniknąć. Idealnie chciałbym sformatować moje zgłoszenie PATCH/api/Activity (1), aby było to coś w rodzaju: {"category": {"__deferred": {"uri": "/api.svc/Categories(2)"} }} Wydaje się to jednak nie działać. Otrzymuję odpowiedź 204, ale właściwość pozostaje niezmieniona po stronie serwera. –
Tak zwane aktualizacje głębokie (które jest tym czego szukasz) nie są obsługiwane przez usługi danych WCF. W rzeczywistości nawet sama OData tak naprawdę jej nie definiuje. Może się to dość skomplikować w niektórych przypadkach. Obawiam się, że partia to jedyne rozwiązanie. Głębokie wstawki są obsługiwane (ale znowu tylko wstawki, nie modyfikując niczego istniejącego). –