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?
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