2013-02-15 15 views
6

Próbuję utworzyć instancję obiektu i dwóch obiektów podrzędnych jednocześnie.Tworzenie jednostek POST z OData z rozszerzeniem

Po wysłaniu następującego JSON-a do zasobu/user_objects szczęśliwie utworzy się jednostka nadrzędna user_object i połączona encja User_object_attribute. Jedyny problem polega na tym, że nie mogę rozszerzyć zestawu wyników o nowy atrybut user_object_attribute, więc mam efektywnie najbardziej uptodate wersję user_object, ale muszę przejść do odczytu z usługi OData tj. Inny serwer trafiony w celu pobierz user_object_attributes.

Po powrocie mam identyfikator, który pasowałby do obiektu child user_object_attribute, ale co by było, gdyby dziecko miało dodatkowe pole generowane po stronie serwera, takie jak created_date? W takim razie muszę ponownie wystartować w repozytorium OData?

Próbowałem już prawidłowego zapytania $ expand? $ Expand = user_objects_attributes i podczas udanego tworzenia nadal nie otrzymałem rozwiniętego zestawu wyników.

Czy ktoś miałby pojęcie, czy jest to możliwe? Czy jest to przypadek, że nie jest tak, ponieważ jedynym sposobem na zrobienie tego byłoby zwrócenie wszystkich atrybutów user_object_attributes?

{ 
    "annotator_id":1, 
    "content_type":"content_type", 
    "created_date":"2013-02-15T17:20:09.191", 
    "guid":"GUID", 
    "size_kb":100, 
    "title":"Title", 
    "updated_date":null, 
    "url":"URL", 
    "user_object_id":0, 
    "user_objects_attributes":[ 
     { 
     "attribute_id":0, 
     "name":"name191", 
     "user_object_id":0, 
     "value":"value191" 
     } 
    ] 
} 

Dzięki, Mark.

Odpowiedz

3

Patrząc na specyfikację OData V3 here:

W wersji 1.0 i wersji 2.0, jeśli wkładka uda się pełny, serwer musi zwrócić odpowiedź z 201 (utworzony) kod statusu oraz treść odpowiedzi zgodna ze składnią określoną we wniosku InsertEntity (sekcja 2.2.7.1.1). Jednostka odpowiedzi MUSI zawierać wartości wstawionego zasobu po tym, jak serwer wykonał wszystkie swoje specyficzne dla serwera reguły przetwarzania danych (sprawdzanie poprawności itd.). Serwer MOŻE zmienić wartości zasobu odebranego od klienta , zanim zasób zostanie wstawiony na serwer.

W wersji 3.0, odpowiedź może mieć kod statusu 204, jak określono w [RFC2616 ], na podstawie preferencji klienta (patrz Wolę (punkt 2.2.5.9) ) na żądanie InsertEntity.

Niezbyt jasne, co powinien zrobić serwer ... zwróć tylko utworzony element najwyższego poziomu lub ten obiekt i wszystkie jego rozwinięte linki.

Nie dziwię się, że rozszerzenie $ nie będzie miało żadnego wpływu na POST (lub jakiekolwiek żądania CUD). WCF DS prawdopodobnie ignoruje go, jeśli nie jest zapytaniem. I według specyfikacji jest to prawdopodobnie poprawne.

Szczerze mówiąc, myślę, że z serwerem WCF DS nie można uzyskać nic więcej. W wersji V3 uzyskasz 201 z jednostką (tylko) lub 204 bez zawartości, jeśli określisz nagłówek mówiąc, że nie chcesz żadnych treści.

Niezależnie od tego, czy jest to zgodne z OData, czy nie ... nie jest całkowicie pewne :-). Niezależnie od tego, nie sądzę, że w tym momencie możesz uzyskać to, czego chcesz na stosie WCF DS.

0

Udało mi się przywrócić właściwości nawigacji po POST, aby utworzyć nowy obiekt przy użyciu opcji zapytania OData v4 $expand bez problemów.

Upewnij się, że twoja metoda została udekorowana numerem [EnableQuery] i zadzwoń pod numer Include z nazwą właściwości nawigacji.

Na przykład:

[EnableQuery] 
public IHttpActionResult Post(user_object user) 
{ 
    if (!this.ModelState.IsValid) 
    { 
     return this.BadRequest(this.ModelState); 
    } 

    this.db.user_objects.Add(user); 
    this.db.SaveChanges(); 

    user = this.db.user_objects.Include("user_objects_attributes").Single(x => x.user_object_id == user.user_object_id)); 

    return this.Created(user); 
} 

Ciąg zapytania POST URL powinien zawierać ?$expand=user_objects_attributes.

zobacz także:
https://github.com/OData/WebApi/issues/356

Powiązane problemy