2013-02-15 8 views
6

Sto tentando di creare un'istanza di un'entità e due entità figlio allo stesso tempo.Creazione di entità OData POST con espansione

Se invio il seguente JSON alla risorsa/user_objects crea felicemente l'entità user_object padre e l'entità User_object_attribute collegata. L'unico problema è che non riesco a espandere il set di risultati per includere il nuovo user_object_attribute, quindi ho effettivamente la versione più aggiornata di user_object ma devo quindi andare a leggere dal servizio OData, vale a dire un altro server colpito per recuperare gli user_object_attributes.

Al ritorno, ho l'ID che andrebbe ben inserito nell'oggetto child_object_attribute del bambino ma cosa accadrebbe se il bambino avesse un campo generato dal lato server come come created_date? Quindi devo ancora colpire di nuovo il repository OData?

Ho provato la query $ expand corretta? $ Expand = user_objects_attributes e mentre la creazione ha esito positivo, non viene ancora restituito il set di risultati espanso.

Qualcuno avrebbe idea se questo è possibile? O è un caso che non lo sia perché l'unico modo per farlo sarebbe restituire tutti i child_object_attributes del bambino?

{ 
    "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" 
     } 
    ] 
} 

Grazie, Mark.

risposta

3

Guardando le specifiche OData V3 here:

Nella versione 1.0 e la versione 2.0, se l'inserto riesce a pieno, il server DEVE restituire una risposta con un (Creato) codice 201 di stato e un corpo di risposta conforme alla sintassi specificata in InsertEntity Request (sezione 2.2.7.1.1). Il corpo della risposta DEVE contenere i valori della risorsa inserita dopo che il server ha eseguito tutte le sue regole di elaborazione dei dati specifiche del server (convalida e così via). Il server PU MAY modificare i valori della risorsa ricevuta dal client prima che la risorsa sia stata inserita sul server.

Nella versione 3.0, la risposta può avere un codice di stato 204, come specificato in [RFC2616], in base alla preferenza del cliente (vedi Preferisco (sezione 2.2.5.9)) sul InsertEntity richiesta.

Non è chiaro cosa deve fare un server ... restituisce solo l'entità creata di livello superiore o quell'entità e tutti i collegamenti espansi.

Non mi sorprende che $ expand non abbia alcun effetto sul POST (o sulle richieste CUD). WCF DS probabilmente lo ignora se non è una query. E dalle specifiche, questo è probabilmente corretto.

Abbastanza francamente, penso che con il server WCF DS non si possa ottenere altro. In V3 ottieni 201 con la tua entità (solo) o 204 senza contenuto se specifichi l'intestazione dicendo che non vuoi contenuti.

Indipendentemente dal fatto che OData sia conforme o meno ... non completamente sicuro :-). Indipendentemente da ciò, non penso che tu possa ottenere ciò che vuoi nello stack di WCF DS in questo momento.

0

Sono stato in grado di restituire le proprietà di navigazione dopo un POST per creare una nuova entità utilizzando l'opzione di query OD2 v4 $expand senza problemi.

Assicurati che il tuo metodo sia decorato con [EnableQuery] e chiami Include con il nome della proprietà di navigazione.

Ad esempio:

[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); 
} 

La stringa di query POST URL dovrebbe includere ?$expand=user_objects_attributes.

Vedi anche:
https://github.com/OData/WebApi/issues/356