2012-10-04 19 views
6

Siguiendo el libro de Julia Lermas 'DbContext' en una solución N-Tier para realizar un seguimiento de los cambios, proporcioné a cada entidad una propiedad de estado y un diccionario de valores originales (a través de IObjectWithState). Después de que se construye la entidad, copio los valores originales en este diccionario. Ver esta muestra (4-23) del libro:Problema de rendimiento de DbContext.Entry

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); 
     } 
    }; 
} 

En el constructor de la BreakAwayContext (heredado de DbContext) el evento ObjectMaterialized es capturado. Para recuperar los valores originales de la entidad, DbEntityEntry se recupera del contexto mediante la llamada a this.Entry (entidad). Esta llamada está ralentizando el proceso. El 80% del tiempo de este controlador de eventos se gasta en esta llamada.

¿Hay una forma más rápida de recuperar los valores originales o las entidades DbEntityEntry?

+0

¿Ha intentado con su otra sugerencia, almacenar la lista de valores modificados? Pensé que almacenar los valores originales sería costoso, así que en mi solución de varios niveles (multiplataforma), almaceno una lista separada por comas que contiene las propiedades modificadas (en Delphi anulando los ajustadores de cada propiedad en Delphi usando plantillas T4 en .Net primero). En el DAL cuando una entidad (o DTO) se envía para actualizaciones, recorro y marco cada propiedad modificada como modificada. Esto no explica una forma más rápida de recuperar los valores originales, pero logrará un seguimiento de cambios desconectado. – reckface

Respuesta

12

Context.Entry() llama a DetectChanges() que depende del número de objetos en contexto y puede ser muy lento. En su caso, podría reemplazarlo con la versión más rápida ((IObjectContextAdapter) ctx).ObjectContext.ObjectStateManager.GetObjectStateEntry(obj);

+0

¡Gracias! Acabo de cambiar mi código para usar su método alternativo. Mi estado recibe llamadas cuando de 8 segundos a .003 – BigJoe714

+0

¡Increíble! recibe llamadas de estado de 4 segundos a prácticamente 0! Usé ((IObjectContextAdapter) ctx) .ObjectContext.ObjectStateManager.GetObjectStateEntry (obj) .ChangeState (EntityState.Modified); –

Cuestiones relacionadas