Condividi tramite


Gestione della concorrenza dei dati

WCF RIA Services supporta la concorrenza ottimistica per assicurare la coerenza dei dati e si basa sugli sviluppatori per fornire la logica per la gestione dei conflitti potenziali che si possono verificare durante l'aggiornamento di un'origine dati. Quando si consente agli utenti di aggiornare o eliminare dati, è necessario verificare che i dati dell'origine dati non siano stati modificati da un altro processo prima di procedere direttamente con l'aggiornamento dei valori nel record di dati o con l'eliminazione dei dati dal record. Se non si esegue questa verifica, è possibile che i valori impostati da un altro processo vengano sovrascritti accidentalmente e che i dati risultino incoerenti. La concorrenza ottimistica presuppone che tali conflitti siano rari, ma confronta il valore che ottiene dall'origine dati e che potrebbe essere stato modificato o eliminato, con il valore attuale dell'origine. Se i valori non corrispondono, viene generata un'eccezione OptimisticConcurrencyException che deve essere gestita.

Per le procedure sulla specifica della verifica per coerenza dei valori, vedere Procedura: abilitare le verifiche della concorrenza ottimistica. Per le informazioni sull'utilizzo delle transazioni esplicite per garantire coerenza, vedere Procedura: aggiungere transazioni esplicite a un servizio del dominio

Utilizzo degli attributi di concorrenza

Per impostazione predefinita, in RIA Services l'entità originale completa non viene passata con i valori modificati al livello di accesso ai dati per verificare la concorrenza dei dati. Al contrario, in RIA Services vengono archiviati e passati nuovamente solo i membri contrassegnati con l'attributo RoundtripOriginalAttribute, ConcurrencyCheckAttribute o TimestampAttribute.

Ognuno di questi attributi può essere applicato alle proprietà in una classe di metadati o alla classe di metadati stessa, se si utilizza Entity Framework. Possono essere applicati anche direttamente a proprietà o classi di tipi CLR quando si utilizzano i modelli di dati definiti da POCO. Per ulteriori informazioni, vedere Procedura: aggiungere classi di metadati. Quando si compila dopo avere applicato questi attributi, i rispettivi attributi vengono visualizzati nel codice generato dal client per le proprietà o le classi. L'applicazione di un attributo a una classe anziché a una proprietà della classe è equivalente all'applicazione dell'attributo a tutti i membri della classe. Gli attributi ConcurrencyCheckAttribute e TimestampAttribute causano anche la visualizzazione di RoundtripOriginalAttribute nella proprietà o nella classe del client a cui sono stati applicati nei metadati del servizio del dominio. Questa implementazione consente di ottimizzare le prestazioni dell'applicazione specificando solo i membri che si desidera partecipino alla verifica della concorrenza. Per ulteriori informazioni, vedere

[!NOTA] Se KeyAttribute è applicato alla proprietà di un tipo di entità, viene anche aggiunto RoundtripOriginalAttribute alla proprietà corrispondente generata sul client quando il progetto viene compilato, quindi nei servizi del dominio generati da un codice sorgente database con la procedura guidata Aggiungi una nuova classe di servizio del dominio. Questo è il comportamento predefinito per le proprietà che servono da chiave di entità.

Quando RoundtripOriginalAttribute è applicato, il livello di accesso ai dati confronta il valore originale nell'origine dati registrato quando i dati sono stati recuperati con il valore corrente dei dati nell'origine dati. Se i valori sono uguali, i dati non sono stati modificati nell'archivio e il livello di accesso ai dati aggiorna o elimina i dati. Se i dati sono stati modificati, si verifica un conflitto e viene generata un'eccezione OptimisticConcurrencyException. Le informazioni sul conflitto sono archiviate nella proprietà EntityConflict dell'entità che non dispone più dei dati correnti.

Se si applica l'attributo ExcludeAttribute a un membro in un'entità che può essere aggiornata o eliminata dal client, non è possibile utilizzare tale membro per le verifiche della concorrenza ottimistica. Quando si esclude il membro, il valore originale corretto non viene archiviato per tale membro e l'operazione di aggiornamento restituirà sempre un risultato di errore. Per ulteriori informazioni, vedere Procedura: aggiungere classi di metadati.

Gestione di OptimisticConcurrencyException

Quando le modifiche ai dati nella cache degli oggetti sono in conflitto con le modifiche apportate nell'origine dati dopo che gli oggetti sono stati aggiunti o aggiornati nella cache viene eseguito il rollback della transazione. Quando si verifica un'eccezione OptimisticConcurrencyException, è necessario gestirla specificando se il conflitto deve essere risolto mantenendo i dati nei dati dell'oggetto (ClientWins) o aggiornando la cache degli oggetti con i dati dell'origine dati (StoreWins). Per le indicazioni su come eseguire questa operazione, vedere Salvataggio delle modifiche e gestione della concorrenza