2012-10-04 24 views
6

Seguendo il libro "DbContext" di Julia Lermas su una soluzione N-Tier di tenere traccia delle modifiche, ho fornito a ciascuna entità una proprietà State e un dizionario OriginalValues ​​(tramite IObjectWithState). Dopo che l'entità è stata costruita, copio i valori originali in questo dizionario. Vedere questo campione (4-23) del libro:DbContext.Entry problema di prestazioni

public BreakAwayContext() 
{ 
    ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += (sender, args) => 
    { 
     var entity = args.Entity as IObjectWithState; 
     if (entity != null) 
     { 
     entity.State = State.Unchanged; 
     entity.OriginalValues = BuildOriginalValues(this.Entry(entity).OriginalValues); 
     } 
    }; 
} 

Nel costruttore della BreakAwayContext (ereditato da DbContext) l'evento ObjectMaterialized 'colto. Per recuperare i valori originali dell'entità, DbEntityEntry viene richiamato dal contesto dalla chiamata a this.Entry (entità). Questa chiamata sta rallentando il processo. L'80% del tempo di questo gestore di eventi è speso per questa chiamata.

Esiste un modo più rapido per recuperare i valori originali o le entità DbEntityEntry?

+0

Hai provato il suo altro suggerimento, per memorizzare invece l'elenco dei valori modificati? Ho pensato che memorizzare i valori originali sarebbe costoso, quindi nella mia soluzione multi-livello (multi-piattaforma), memorizzo una lista separata da virgole contenente proprietà modificate (in Delphi sovrascrivendo i setter di ogni proprietà in Delphi usando i modelli T4 in .Net All'inizio). Nel DAL quando un'entità (o DTO) viene inviata per gli aggiornamenti, eseguo il looping e contrassegno ogni proprietà modificata come modificata. Questo non spiega un modo più veloce per recuperare i valori originali, ma otterrà il rilevamento delle modifiche disconnesse. – reckface

risposta

12

Context.Entry() chiama DetectChanges() che dipende dal numero di oggetti nel contesto e potrebbe essere molto lento. Nel tuo caso potresti sostituire con una versione più veloce ((IObjectContextAdapter) ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(obj);

+0

Grazie! Ho appena scambiato il mio codice per utilizzare il metodo alternativo. Le mie chiamate di stato get quando da 8 secondi a .003 – BigJoe714

+0

Incredibile! ricevi chiamate di stato da 4 secondi a praticamente 0! Ho usato ((IObjectContextAdapter) ctx) .ObjectContext.ObjectStateManager.GetObjectStateEntry (obj) .ChangeState (EntityState.Modified); –

Problemi correlati