2013-03-20 12 views
6

Utilizzo di brezza supportato da SharePoint, come descritto in here, e utilizzando TypeScript anziché JS.Perché l'entitàAspetto degli oggetti della mia query deve essere nullo?

In una classe DataService creo un EntityManager e eseguire una query:

private servicePath: string = '/api/PATH/'; 
private manager: breeze.EntityManager; 

constructor() { 
    this.init(); 
} 

private init(): void { 
    this.manager = new breeze.EntityManager(this.servicePath); 
} 

public ListResponses(): breeze.Promise { 
    var query = breeze.EntityQuery.from("Responses"); 
    return this.manager.executeQuery(query); 
} 

Ho poi chiamo questo dal mio modello di vista, che funziona bene:

private loadResponses(): void { 
    this.dataservice.ListResponses().then((data) => { 
     this.handleResponsesLoaded(data); 
    }).fail((error) => { 
     this.handleDataError(error); 
    }); 
} 

private handleResponsesLoaded(data:any): void { 
    for (var i = 0; i < results.length; i++){ 
     this.extendItem(results[i]); 
    } 
    this.renderList(results, "#tp-responses-list"); 
} 

Ma il mio tentativo di estendere ogni articolo non riesce, a causa della voce entityAspect è nullo:

private extendItem(item: any): void { 
    item.entityAspect.propertyChanged.subscribe(() => { // FAILS HERE 
     setTimeout(() => { 
      if (item.entityAspect.entityState.isModified()) { 
       this.dataservice.SaveChanges().then((result) => { 
        tracer.Trace("SaveChanged Result: " + result); 
       }).fail((error) => { 
        this.handleDataError(error); 
       }); 
      } 
     }, 0); 
    }); 
} 

Upon i nspecting la voce risultato, posso vedere è solo l'oggetto pianura dei dati, con tutte le proprietà mi sarei aspettato, ma nessuna entità bontà:

enter image description here

Ho appena iniziato con la brezza, quindi il modo migliore per mettere la domanda è probabilmente: cosa ho fatto di sbagliato qui?

risposta

5

Se Breeze non riesce a trovare un tipo corrispondente nei suoi metadati a ciò che riceve come risultato di una query, restituisce semplicemente l'oggetto json "raw".

La ragione per cui i metadati non è disponibile è di solito a causa di una delle due spiegazioni:

1) Lei non è serializzare le informazioni sul tipo nella risposta alla query. L'attributo [BreezeController] o gli attributi [BreezeJsonFormatter] lo realizzano entrambi.

2) La query non restituisce i tipi per i quali sono stati descritti i metadati. È possibile creare i metadati direttamente sul client in questo caso, oppure farlo restituire dal server tramite un metodo "Metadata". (vedi l'esempio NoDb nel pacchetto Breeze Zip per un esempio del primo).

È anche possibile esaminare JsonResultsAdapter se si desidera forzare qualsiasi risultato di query in un tipo di metadati "noto", ma in genere non è necessario se si utilizza l'attributo [BreezeController].

Spero che questo aiuti.

+0

Jay - Grazie per la pronta risposta. Sto usando i metadati estratti da edmx di un riferimento al servizio, ma ci deve essere qualcosa di sbagliato in questo: cercherò di risolverlo (ho molti tipi di entità e non voglio applicare manualmente i metadati in il cliente se posso aiutarlo). Un rapido follow-up quindi: in che modo breeze corrisponde ai metadati? Si basa sul nome del tipo o su una mappa di proprietà come un'interfaccia o ...? – JcFx

+0

è possibile ottenere l'elenco dei tipi che il metadataStore contiene tramite il metodo getEntityTypes. Ogni tipo di entità ha una proprietà 'name' e una 'shortname', può essere abbinata. –

+0

Lo vedrò domani mattina. Grazie ancora. – JcFx

2

La seguente risposta non è mia, ma di OP. È stato pubblicato nella domanda stessa, mentre dovrebbe avere una risposta.


il problema era una mancata corrispondenza dello spazio dei nomi. Sto estraendo i metadati da un edmx generato da un riferimento al servizio di Visual Studio. Questo edmx usa lo spazio dei nomi del servizio che sta chiamando. I miei oggetti proxy risiedono in un diverso spazio dei nomi. La ricerca dell'entità di Breeze (anche usando il nome breve) è nel formato Namespace di tipo #, quindi non ho trovato corrispondenze. Ho modificato il mio metodo personalizzato BuildJsonMetadata sul server per scambiare gli spazi dei nomi e ora ho le entità decorate correttamente che funzionano correttamente.

Problemi correlati