Condividi tramite


Materializzazione di oggetti (WCF Data Services)

Quando si utilizza la finestra di dialogo Aggiungi riferimento al servizio per servirsi di un feed OData (Open Data Protocol) in un'applicazione client basata su .NET Framework, vengono generate le classi di dati equivalenti per ogni tipo di entità nel modello di dati esposto dal feed. Per ulteriori informazioni, vedere Generazione di classi del servizio dati client (WCF Data Services). I dati di entità restituiti da una query vengono materializzati in un'istanza di una delle classi del servizio dati client generate. Per informazioni sulle opzioni di unione e sulla risoluzione di identità per gli oggetti tracciati, vedere Gestione del contesto del servizio dati (WCF Data Services).

Anziché utilizzare le classi di dati generate dallo strumento, WCF Data Services consente inoltre di definire classi personalizzate del servizio dati client. In questo modo è possibile utilizzare le proprie classi di dati, note anche come classi di dati POCO (Plain-Old CLR Object). Quando si utilizzano questi tipi di classi di dati personalizzate, è necessario attribuire la classe di dati con DataServiceKeyAttribute o DataServiceEntityAttribute e assicurarsi che i nomi del tipo nel client corrispondano ai nomi del tipo nel modello di dati del servizio dati.

Materializzazione delle entità da una risposta a una query

Dopo aver ricevuto il messaggio di risposta alla query, la libreria materializza i dati restituiti dal feed OData in istanze di classi del servizio dati client corrispondenti al tipo della query. Di seguito viene descritto il processo generale di materializzazione di tali oggetti.

  1. La libreria client legge il tipo serializzato dall'elemento entry nel feed del messaggio di risposta e tenta di creare una nuova istanza del tipo corretto utilizzando uno dei modi riportati di seguito.

    • Quando il nome del tipo dichiarato nel feed è identico al nome del tipo dell'oggetto DataServiceQuery<TElement>, viene creata una nuova istanza di questo tipo utilizzando il costruttore vuoto.

    • Quando il nome del tipo dichiarato nel feed è identico al nome del tipo derivato dal tipo dell'oggetto DataServiceQuery<TElement>, viene creata una nuova istanza di questo tipo derivato utilizzando il costruttore vuoto.

    • Quando il tipo dichiarato nel feed non corrisponde al tipo dell'oggetto DataServiceQuery<TElement> o a qualsiasi tipo derivato, viene creata una nuova istanza del tipo sottoposto a query utilizzando il costruttore vuoto.

    • Quando viene impostata la proprietà ResolveType, viene chiamato il delegato fornito per eseguire l'override del mapping dei tipi basato sul nome predefinito e viene creata una nuova istanza del tipo restituito da Func<T, TResult>. Se questo delegato restituisce un valore Null, viene creata invece una nuova istanza del tipo sottoposto a query. Per supportare scenari di ereditarietà, è possibile che sia necessario eseguire l'override del mapping dei nomi dei tipi basato sul nome predefinito.

  2. La libreria client legge il valore URI dall'elemento id di entry corrispondente al valore di identità dell'entità. Se per MergeOption non viene utilizzato il valore NoTracking, per rilevare l'oggetto in DataServiceContext viene utilizzato il valore di identità. Il valore di identità viene inoltre utilizzato per garantire la creazione di una sola istanza di entità, anche nel caso in cui un'entità venga restituita più volte nella risposta alla query.

  3. La libreria client legge le proprietà dalla voce di feed e imposta le proprietà corrispondenti sull'oggetto appena creato. Quando in DataServiceContext è già presente un oggetto che dispone dello stesso valore di identità, le proprietà vengono impostate in base all'impostazione MergeOption di DataServiceContext. La risposta potrebbe contenere valori di proprietà per cui non è presente una proprietà corrispondente nel tipo client. In questo caso, l'azione dipende dal valore della proprietà IgnoreMissingProperties di DataServiceContext. Quando questa proprietà è impostata su true, la proprietà mancante viene ignorata. In caso contrario, viene generato un errore. Le proprietà vengono impostate come indicato di seguito:

    • Le proprietà scalari vengono impostate sul valore corrispondente nella voce del messaggio di risposta.

    • Le proprietà complesse vengono impostate su una nuova istanza di tipo complesso, impostata con le proprietà del tipo complesso dalla risposta.

    • Le proprietà di navigazione che restituiscono una raccolta di entità correlate vengono impostate su un'istanza di ICollection<T> nuova o esistente, dove T corrisponde al tipo dell'entità correlata. La raccolta è vuota se gli oggetti correlati non sono stati caricati in DataServiceContext. Per ulteriori informazioni, vedere Caricamento di contenuto posticipato (WCF Data Services).

      Nota

      Quando le classi di dati client generate supportano l'associazione dati, le proprietà di navigazione restituiscono invece istanze della classe DataServiceCollection<T>.Per ulteriori informazioni, vedere Associazione di dati a controlli (WCF Data Services).

  4. Viene generato l'evento ReadingEntity.

  5. La libreria client collega l'oggetto a DataServiceContext. Quando MergeOption è NoTracking, l'oggetto non viene collegato.

Vedere anche

Concetti

Esecuzione di query sul servizio dati (WCF Data Services)

Proiezioni di query (WCF Data Services)