2013-02-05 20 views
9

Non si sa bene come formulare questa domanda, ma qui va. Sto lavorando a un progetto in cui più applicazioni client accedono a un'origine dati tramite un servizio WCF. Potrebbe non essere rilevante, ma il servizio WCF sta utilizzando il framework di entità per accedere a questa origine dati. Ogni volta che un cliente ha richiesto un record per la modifica, vorrei impedire che lo stesso record venga modificato dal resto dei client fino a quando il primo client non ha completato l'aggiornamento.Procedura consigliata per bloccare un record per la modifica mentre si utilizza il framework di entità

Correggetemi se ho torto ma credo che questo sia noto anche come accesso ai dati sincrono e asincrono.

La mia domanda è, qual è la migliore pratica del settore per implementare questa funzionalità. C'è un modo per controllare questo dal lato del database (utilizzando SQL) o deve essere fatto attraverso il client?

Ho preso in considerazione l'inclusione di una colonna "EditMode" booleana per ogni tabella e semplicemente l'impostazione su true quando è in corso di modifica e controllare se è impostata su true prima di consentire a un altro client di accedere a quel record.

risposta

6

È consigliabile utilizzare RowVersion e il blocco ottimistico.

Optimistic Concurrency Patterns spiegato.

Se si utilizza prima il codice, includere un campo nel POCO.

public virtual byte[] RowVersion { get; set; } 

EF aggiungerà una proprietà/RowVersion Timestamp al vostro tavolo. Sarà controllato durante l'aggiornamento. E automaticamente aggiornato dal DB quando modificato.

MODIFICA: per spiegare meglio.

Ciò che EF sta cercando sono proprietà che sono campi di concorrenza in modo da poter effettivamente controllare la concorrenza con uno o più campi.

entity.Property(p => p.RowVersion).IsConcurrencyToken() 

quando si esegue un aggiornamento o cancellarti intercettare l'eccezione definita

catch (DbUpdateConcurrencyException ex) 

EF tratta il RowVersion come segno di concorrenza. Questo è l'approccio generalmente utilizzato. Poiché SQLServer aggiornerà automaticamente questo tipo di campo per te. Quindi molto veloce e facile. Ma puoi dire a EF che una proprietà è un token di concorrenza esplicitamente e ne ha più di uno.

Quindi EF deve aggiungere proprietà alla clausola where per gli aggiornamenti ed elimina per assicurarsi che il record non sia cambiato dall'accesso.

+0

Grazie, questo sembra essere esattamente ciò di cui avevo bisogno. Non ero sicuro di cosa si chiamasse per fare la ricerca da solo. –

+0

@phil soday - Se il codice che usi per primo lo fa e lo metti nel tuo dominio, lo fa automaticamente per bloccare RowVersion? Deve essere chiamato RowVersion? Fa un'eccezione o come funziona? – chobo2

+0

Questo sembra essere quello di cui ho bisogno e comunque non sto usando il codice prima. Sto ancora usando EF5 edmx è il loro modo di implementare ciò che succede se l'utente b apporta una modifica prima che l'utente risparmi – rogue39nin

Problemi correlati