2012-09-03 18 views
9

Tengo una aplicación WPF que tiene una cuadrícula con una lista de datos que he cargado con EF. Algunas otras ventanas pueden realizar cambios en los mismos datos cargados en la grilla pero usando una instancia de dbcontext diferente. ¿Cómo puedo ver los datos modificados en la cuadrícula? Sé que puedo actualizar una sola entidad con ctx.Entry<MyEntity>(instance).Reload();, pero quiero ver todos los cambios y no importa lo que haga, solo veo los valores anteriores. No puedo usar AsNoTracking ni crear una nueva instancia de DbContext en este caso.Cambios de carga realizados en otro DbContext

+0

¿Por qué no puede usar 'AsNoTracking'? –

+0

Porque el usuario puede realizar cambios directamente a la grilla y guardarla. – user1526627

+0

Pero en tal caso, ¿puede haber editado datos no guardados y la recarga puede hacer que estos datos sean diferentes? ¿Cómo quieres resolver ese problema? –

Respuesta

13

Para mí parece un caso muy simple y no puedo ver por qué EF no solo actualiza los valores de las entidades.

EF tiene este mecanismo también, pero no está expuesto en DbContext API. Debe volver a ObjectContext. Si lo que desea para recargar el conjunto de entidades que llamará:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload); 

RefreshMode.StoreWins hace que todos los cambios pendientes a ser sustituidos por valores vuelto a cargar. También puede usar RefreshMode.ClientWins que mantendrá sus cambios y los fusionará con los datos recargados. El problema con este enfoque es que solo recarga las entidades que ya tiene. No obtendrás nuevas entidades.

Si desea obtener nuevas entidades, así es necesario ejecutar una consulta y deberá informar a EF que desea volver a cargar los valores:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
var objectSet = objectContext.CreateObjectSet<MyEntity>(); 
objectSet.MergeOption = MergeOption.OverwriteChanges; 
var result = objectSet.Where(...).ToList(); 

Una vez más MergeOption.OverwriteChanges sobrescribe todos los cambios pendientes, pero puede utilizar MergeOption.PreserveChanges fusionar valores recargados a sus valores editados.

Creo que todavía puede haber algunos problemas con valores refrescantes con algunas relaciones y quizás también entidades que se eliminaron en la base de datos.

+0

Esto es exactamente lo que necesito, gracias, mi fe en EF está restaurada :) – user1526627

+0

@ ladislav-mrnka Una pregunta, ¿ese último paso es realmente necesario? Si te entendí correctamente, EF solo reconocerá los cambios en los registros que ya se hayan cargado y los fusionará de la primera manera. Entonces, si agregara una nueva fila a una tabla manualmente, ¿no se actualizaría en el contexto dbcontext de la primera manera? Acabo de probar esto y no vi la necesidad de la segunda manera. Tal vez el comportamiento cambió o te malentendí por completo. :) – DrCopyPaste

Cuestiones relacionadas