Condividi tramite


Gestione del contesto del servizio dati (WCF Data Services)

Gg602811.note(it-it,VS.100).gifNota:
In questo argomento viene descritta una nuova funzionalità di WCF Data Services, che supporta la versione 3 del protocollo OData ed è disponibile sotto forma di aggiornamento di .NET Framework 4. Questo aggiornamento può essere scaricato dall'Area download Microsoft.

La classe DataServiceContext incapsula operazioni supportate su un servizio dati specificato. Sebbene i servizi OData siano senza stato, non lo è il contesto. È pertanto possibile utilizzare la classe DataServiceContext per mantenere lo stato nel client tra le interazioni con il servizio dati in modo da supportare funzionalità quali la gestione di modifiche. Questa classe consente inoltre di gestire le identità e di rilevare le modifiche.

Risoluzione di identità e opzioni di unione

Quando viene eseguito un oggetto DataServiceQuery, le entità nel feed di risposta vengono materializzate in oggetti. Per ulteriori informazioni, vedere Materializzazione di oggetti (WCF Data Services). La modalità di materializzazione in oggetti delle voci presenti in un messaggio di risposta si basa sulla risoluzione di identità e dipende dall'opzione di unione con cui è stata eseguita la query. Quando più query o richieste di caricamento vengono eseguite nell'ambito di un solo DataServiceContext, il client WCF Data Services rileva solo un'istanza di un oggetto con un valore della chiave specifico. Questa chiave, utilizzata per eseguire la risoluzione di identità, identifica in modo univoco un'entità.

Per impostazione predefinita, il client materializza una sola voce del feed di risposta in un oggetto delle entità non ancora rilevate da DataServiceContext. In altre parole, non vengono sovrascritte le modifiche agli oggetti già presenti nella cache. Questo comportamento viene controllato specificando un valore MergeOption per le query e le operazioni di caricamento. Questa opzione viene specificata impostando la proprietà MergeOption su DataServiceContext. Il valore dell'opzione di unione predefinita è AppendOnly. Questo valore consente di materializzare gli oggetti delle entità non ancora rilevate. Ciò significa che gli oggetti esistenti non vengono sovrascritti. Un'altra modalità per impedire che gli oggetti sul client vengano sovrascritti dagli aggiornamenti del servizio dati consiste nello specificare PreserveChanges. Quando si specifica OverwriteChanges, i valori degli oggetti nel client vengono sostituiti dai valori più recenti delle voci presenti nel feed di risposta, anche se a tali oggetti sono già state apportate modifiche. Quando viene utilizzata un'opzione di unione NoTracking, DataServiceContext non può inviare al servizio dati le modifiche apportate agli oggetti del client. Con questa opzione le modifiche vengono sempre sovrascritte dai valori del servizio dati.

Gestione della concorrenza

OData supporta la concorrenza ottimistica che consente al servizio dati il rilevamento dei conflitti di aggiornamento. È possibile configurare il provider del servizio dati in modo che il servizio dati verifichi le modifiche alle entità tramite un token di concorrenza. Il token è costituito da una o più proprietà di un tipo di entità che vengono convalidate dal servizio dati per determinare se una risorsa è stata modificata. I token di concorrenza inclusi nell'intestazione eTag delle richieste al servizio dati e delle relative risposte vengono gestiti automaticamente dal client WCF Data Services . Per ulteriori informazioni, vedere Aggiornamento del servizio dati (WCF Data Services).

DataServiceContext rileva le modifiche apportate agli oggetti segnalati manualmente tramite AddObject, UpdateObject e DeleteObject o tramite un oggetto DataServiceCollection. Quando viene chiamato il metodo SaveChanges, il client restituisce modifiche al servizio dati. SaveChanges può avere esito negativo quando si verifica un conflitto tra le modifiche dei dati nel client e quelle nel servizio dati. Quando si verifica ciò, è necessario eseguire una nuova query per la risorsa dell'entità per ricevere i dati dell'aggiornamento. Per sovrascrivere le modifiche nel servizio dati, eseguire la query utilizzando l'opzione di unione PreserveChanges. Quando si chiama nuovamente SaveChanges, le modifiche salvate sul client vengono salvate in modo permanente nel servizio dati e rimangono in tale posizione fino a quando le altre modifiche non vengono apportate alla risorsa nel servizio dati.

Salvataggio delle modifiche

Le modifiche vengono rilevate nell'istanza di DataServiceContext, ma non vengono inviate immediatamente al server. Dopo aver apportato le modifiche necessarie per un'attività specificata, chiamare SaveChanges per inviare tutte le modifiche al servizio dati. Un oggetto DataServiceResponse verrà restituito al complemento dell'operazione SaveChanges. L'oggetto DataServiceResponse include una sequenza di oggetti OperationResponse che a loro volta contengono una sequenza di istanze di EntityDescriptor o LinkDescriptor che rappresentano le modifiche persistenti o tentate. Quando un'entità viene creata o modificata nel servizio dati, in EntityDescriptor è presente un riferimento all'entità aggiornata, inclusi i valori di proprietà generati dal server, ad esempio il valore ProductID generato nell'esempio precedente. Nella libreria client l'oggetto .NET Framework viene aggiornato automaticamente in modo da impostare i nuovi valori.

Per le operazioni di inserimento e aggiornamento completate correttamente, la proprietà di stato dell'oggetto EntityDescriptor o LinkDescriptor associato all'operazione viene impostata su Unchanged e i nuovi valori vengono uniti tramite OverwriteChanges. Quando un'operazione di inserimento, aggiornamento o eliminazione non riesce nel servizio dati, lo stato dell'entità rimane invariato rispetto a prima della chiamata del metodo SaveChanges e la proprietà Error di OperationResponse viene impostata su un oggetto DataServiceRequestException contenente le informazioni sull'errore. Per ulteriori informazioni, vedere Aggiornamento del servizio dati (WCF Data Services).

Impostazione del metodo HTTP per gli aggiornamenti

Per impostazione predefinita, la libreria client .NET Framework invia aggiornamenti alle entità esistenti come richieste MERGE. Una richiesta MERGE aggiorna le proprietà selezionate dell'entità. Il client tuttavia include sempre tutte le proprietà nella richiesta MERGE, anche le proprietà che non sono modificate. Il protocollo OData supporta anche l'invio delle richieste PUT per aggiornare le entità. In una richiesta PUT, un'entità esistente viene essenzialmente sostituita con una nuova istanza dell'entità con i valori della proprietà dal client. Per utilizzare richieste PUT, impostare il flag ReplaceOnUpdate sull'enumerazione SaveChangesOptions quando si chiama SaveChanges.

Gg602811.note(it-it,VS.100).gifNota:
Una richiesta PUT si comporterà in modo diverso da una richiesta MERGE se il client non conosce tutte le proprietà dell'entità. Questo potrebbe verificarsi quando si proietta un tipo di entità in un nuovo tipo sul client. Si potrebbe verificare anche quando nuove proprietà sono state aggiunte all'entità nel modello di dati del servizio e la proprietà IgnoreMissingProperties di DataServiceContext è impostata su true per ignorare tali errori del mapping client. In questi casi, una richiesta PUT reimposterà qualsiasi proprietà sconosciuta al client sui valori predefiniti.

Vedere anche

Concetti

Aggiornamento del servizio dati (WCF Data Services)
Operazioni asincrone (WCF Data Services)
Invio in batch di operazioni (WCF Data Services)

Altre risorse

Libreria client WCF Data Services