Gestione del contesto del servizio dati (WCF Data Services)Managing the Data Service Context (WCF Data Services)

La classe DataServiceContext incapsula operazioni supportate su un servizio dati specificato.The DataServiceContext class encapsulates operations that are supported against a specified data service. Sebbene i servizi ODataOData siano senza stato, non lo è il contesto.Although ODataOData services are stateless, the context is not. Pertanto, è possibile utilizzare la DataServiceContext classe per mantenere lo stato nel client tra le interazioni con il servizio dati per supportare funzionalità quali la gestione dei cambiamenti.Therefore, you can use the DataServiceContext class to maintain state on the client between interactions with the data service in order to support features such as change management. Questa classe consente inoltre di gestire le identità e di rilevare le modifiche.This class also manages identities and tracks changes.

Risoluzione di identità e opzioni di unioneMerge Options and Identity Resolution

Quando viene eseguito un oggetto DataServiceQuery<TElement>, le entità nel feed di risposta vengono materializzate in oggetti.When a DataServiceQuery<TElement> is executed, the entities in the response feed are materialized into objects. Per ulteriori informazioni, vedere materializzazione degli oggetti.For more information, see Object Materialization. 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.The way in which entries in a response message are materialized into objects is performed based on identity resolution and depends on the merge option under which the query was executed. Quando più query o richieste di caricamento vengono eseguite nell'ambito di un solo DataServiceContext, il client WCF Data ServicesWCF Data Services rileva solo un'istanza di un oggetto con un valore della chiave specifico.When multiple queries or load requests are executed in the scope of a single DataServiceContext, the WCF Data ServicesWCF Data Services client only tracks a single instance of an object that has a specific key value. Questa chiave, usata per eseguire la risoluzione di identità, identifica in modo univoco un'entità.This key, which is used to perform identity resolution, uniquely identifies an entity.

Per impostazione predefinita, il client materializza una sola voce del feed di risposta in un oggetto delle entità non ancora rilevate da DataServiceContext.By default, the client only materializes an entry in the response feed into an object for entities that are not already being tracked by the DataServiceContext. In altre parole, non vengono sovrascritte le modifiche agli oggetti già presenti nella cache.This means that changes to objects already in the cache are not overwritten. Questo comportamento viene controllato specificando un valore MergeOption per le query e le operazioni di caricamento.This behavior is controlled by specifying a MergeOption value for queries and load operations. Questa opzione viene specificata impostando la proprietà MergeOption su DataServiceContext.This option is specified by setting the MergeOption property on the DataServiceContext. Il valore dell'opzione di unione predefinita è AppendOnly.The default merge option value is AppendOnly. Questo valore consente di materializzare gli oggetti delle entità non ancora rilevate. Ciò significa che gli oggetti esistenti non vengono sovrascritti.This only materializes objects for entities that are not already being tracked, which means that existing objects are not overwritten. Un'altra modalità per impedire che gli oggetti sul client vengano sovrascritti dagli aggiornamenti del servizio dati consiste nello specificare PreserveChanges.Another way to prevent changes to objects on the client from being overwritten by updates from the data service is to specify 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.When you specify OverwriteChanges, values of objects on the client are replaced by the latest values from the entries in the response feed, even if changes have already been made to these objects. Quando viene usata un'opzione di unione NoTracking, DataServiceContext non può inviare al servizio dati le modifiche apportate agli oggetti del client.When a NoTracking merge option is used, the DataServiceContext cannot send changes made on client objects to the data service. Con questa opzione le modifiche vengono sempre sovrascritte dai valori del servizio dati.With this option, changes are always overwritten with values from the data service.

Gestione della concorrenzaManaging Concurrency

ODataOData supporta la concorrenza ottimistica che consente al servizio dati rilevare i conflitti di aggiornamento. supports optimistic concurrency that enables the data service to detect update conflicts. È possibile configurare il provider del servizio dati in modo che il servizio dati verifichi le modifiche alle entità tramite un token di concorrenza.The data service provider can be configured in such a way that the data service checks for changes to entities by using a concurrency token. 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.This token includes one or more properties of an entity type that are validated by the data service to determine whether a resource has changed. I token di concorrenza, che include l'intestazione eTag delle richieste di e le risposte dal servizio dati, vengono gestiti automaticamente dal WCF Data ServicesWCF Data Services client.Concurrency tokens, which are included in the eTag header of requests to and responses from the data service, are managed for you by the WCF Data ServicesWCF Data Services client. Per ulteriori informazioni, vedere l'aggiornamento del servizio dati.For more information, see Updating the Data Service.

DataServiceContext rileva le modifiche apportate agli oggetti segnalati manualmente tramite AddObject, UpdateObject e DeleteObject o tramite un oggetto DataServiceCollection<T>.The DataServiceContext tracks changes made to objects that have been reported manually by using AddObject, UpdateObject, and DeleteObject, or by a DataServiceCollection<T>. Quando si chiama il metodo SaveChanges, il client restituisce le modifiche al servizio dati.When the SaveChanges method is called, the client sends changes back to the data service. Quando le modifiche del client sono in conflitto con quelle del servizio dati, è possibile che l'esecuzione del metodo SaveChanges non riesca.SaveChanges can fail when data changes in the client conflict with changes in the data service. Quando si verifica ciò, è necessario eseguire una nuova query per la risorsa dell'entità per ricevere i dati dell'aggiornamento.When this occurs, you must query for the entity resource again to receive the update data. Per sovrascrivere le modifiche nel servizio dati, eseguire la query usando l'opzione di unione PreserveChanges.To overwrite changes in the data service, execute the query using the PreserveChanges merge option. 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.When you call SaveChanges again, the changes preserved on the client are persisted to the data service, as long as other changes have not already been made to the resource in the data service.

Salvataggio delle modificheSaving Changes

Le modifiche vengono rilevate nell'istanza di DataServiceContext, ma non vengono inviate immediatamente al server.Changes are tracked in the DataServiceContext instance but not sent to the server immediately. Dopo aver apportato le modifiche necessarie per un'attività specificata, chiamare SaveChanges per inviare tutte le modifiche al servizio dati.After you are finished with the required changes for a specified activity, call SaveChanges to submit all the changes to the data service. Un oggetto DataServiceResponse verrà restituito al complemento dell'operazione SaveChanges.A DataServiceResponse object is returned after the SaveChanges operation is complete. 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.The DataServiceResponse object includes a sequence of OperationResponse objects that, in turn, contain a sequence of EntityDescriptor or LinkDescriptor instances that represent the changes persisted or attempted. 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.When an entity is created or modified in the data service, the EntityDescriptor includes a reference to the updated entity, including any server-generated property values, such as the generated ProductID value in the previous example. Nella libreria client l'oggetto .NET Framework.NET Framework viene aggiornato automaticamente in modo da impostare i nuovi valori.The client library automatically updates the .NET Framework.NET Framework object to have these new values.

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.For successful insert and update operations, the state property of the EntityDescriptor or LinkDescriptor object associated with the operation is set to Unchanged and the new values are merged by using 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.When an insert, update, or delete operation fails in the data service, the entity state remains the same as it was before SaveChanges was called, and the Error property of the OperationResponse is set to an DataServiceRequestException that contains information about the error. Per ulteriori informazioni, vedere l'aggiornamento del servizio dati.For more information, see Updating the Data Service.

Impostazione del metodo HTTP per gli aggiornamentiSetting the HTTP Method for Updates

Per impostazione predefinita, la libreria client .NET Framework invia aggiornamenti alle entità esistenti come richieste MERGE.By default, the .NET Framework client library sends updates to existing entities as MERGE requests. 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.A MERGE request updates selected properties of the entity; however the client always includes all properties in the MERGE request, even properties that have not changed. Il protocollo ODataOData supporta anche l'invio delle richieste PUT per aggiornare le entità.The ODataOData protocol also supports sending PUT requests to update entities. In una richiesta PUT, un'entità esistente viene essenzialmente sostituita con una nuova istanza dell'entità con i valori della proprietà dal client.In a PUT request, an existing entity is essentially replaced with a new instance of the entity with property values from the client. Per usare richieste PUT, impostare il flag ReplaceOnUpdate sull'enumerazione SaveChangesOptions quando si chiama SaveChanges.To use PUT requests, set the ReplaceOnUpdate flag on the SaveChangesOptions enumeration when calling SaveChanges.

Nota

Una richiesta PUT si comporterà in modo diverso da una richiesta MERGE se il client non conosce tutte le proprietà dell'entità.A PUT request will behave differently than a MERGE request when the client does not know about all properties of the entity. Questo potrebbe verificarsi quando si proietta un tipo di entità in un nuovo tipo sul client.This might occur when projecting an entity type into a new type on the 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.It might also occur when new properties have been added to the entity in the service data model and the IgnoreMissingProperties property on the DataServiceContext is set to true to ignore such client mapping errors. In questi casi, una richiesta PUT reimposterà qualsiasi proprietà sconosciuta al client sui valori predefiniti.In these cases, a PUT request will reset any properties that are unknown to the client to their default values.

POST tunnelingPOST Tunneling

Per impostazione predefinita, la libreria client invia richieste di creazione, lettura, aggiornamento ed eliminazione a un servizio ODataOData tramite i metodi HTTP corrispondenti di POST, GET, PUT/MERGE/PATCH e DELETE.By default, the client library sends create, read, update, and delete requests to an ODataOData service by using the corresponding HTTP methods of POST, GET, PUT/MERGE/PATCH, and DELETE. In questo modo vengono conservati i principi di base di REST (Representational State Transfer).This upholds the basic principles of Representational State Transfer (REST). Tuttavia, non tutte le implementazioni del server Web supportano il set completo di metodi HTTP.However, not every Web server implementation supports the full set of HTTP methods. In alcuni casi, i metodi supportati potrebbero essere limitati solo a GET e POST.In some cases, the supported methods might be restricted to just GET and POST. Ciò può verificarsi quando un intermediario, ad esempio un firewall, blocca le richieste con alcuni metodi.This can happen when an intermediary, like a firewall, blocks requests with certain methods. Poiché i metodi GET e POST sono quelli supportati più frequentemente, ODataOData stabilisce una modalità per eseguire tutti i metodi HTTP non supportati tramite una richiesta POST.Because the GET and POST methods are most often supported, ODataOData prescribes a way to execute any unsupported HTTP methods by using a POST request. Noto come il tunneling del metodo o POST tunneling, in questo modo un client di inviare una richiesta POST con il metodo effettivo specificato nell'oggetto personalizzato X-HTTP-Method intestazione.Known as method tunneling or POST tunneling, this enables a client to send a POST request with the actual method specified in the custom X-HTTP-Method header. Per abilitare il POST tunneling per le richieste, impostare la proprietà UsePostTunneling nell'istanza di DataServiceContext su true.To enable POST tunneling for requests, set the UsePostTunneling property on the DataServiceContext instance to true.

Vedere ancheSee Also

Libreria client WCF Data ServicesWCF Data Services Client Library
Aggiornamento del servizio datiUpdating the Data Service
Operazioni asincroneAsynchronous Operations
Esecuzione di operazioni in batchBatching Operations