2011-04-27 22 views
10

Estoy usando una sola instancia del escenario DbContext para sombrear toda la copia de la base de datos localmente en una aplicación WPF. He oído que esto es una mala práctica, pero mi base de datos es pequeña y necesito una copia completa de ella localmente mientras se ejecuta la aplicación.Entity Framework 4.1 DbSet Reload

un método de extensión para IQueryable, Load() me permite precargar los elementos de un DbSet<>, de modo que pueda unir las cosas a la propiedad local de DbSet<>. Los datos en la base de datos cambian rápidamente, así que quiero SaveChanges() y volver a cargar todo, incluso los objetos que ya están rastreados. Llamar nuevamente al método Load() no actualiza los elementos que se rastrean pero que no están marcados como cambiados, que ya están cargados.

¿Cuál es el método preferido para volver a cargar los artículos precargados en un DbSet<>? Fuera de mi cabeza, solo puedo pensar en llamar al SaveChanges(), luego revisar todas las entradas y establecer tanto los valores originales como los rastreados en los valores actuales en la base de datos, luego Load() cualesquiera objetos nuevos que puedan haberse agregado. En mi caso, no es posible eliminar objetos, pero es posible que tenga que admitir la eliminación de elementos a largo plazo. Esto no parece correcto, debería haber una forma de dejar todo y volver a cargar. Parece que es más fácil olvidar mi contexto y comenzar de nuevo, pero todos los elementos en WPF ya están vinculados al Local´ObservableCollection<>, y esto simplemente arruina la interfaz.

Respuesta

24

Esta no es la forma en que se supone que debe usar DbContext, y por eso es casi imposible volver a cargar los datos. Mantener un contexto único por mucho tiempo es incorrect usage. El enlace también responderá por qué las entidades rastreadas no se actualizan.

puede volver a cargar selectivamente una sola entidad llamando Reload en DbEntityEntry:

context.Entry(entity).Reload(); 

También puede volver a utilizar ObjectContext y ObjectQuery con MergeOption.OverrideChanges, o utilizar Refresh para una colección de entidades con RefreshMode.StoreWins.

Todos estos enfoques sufre algunos problemas:

  • Si se elimina el registro en la base de datos, no se eliminará a partir del contexto.
  • Los cambios en las relaciones no siempre se actualizan.

La única forma correcta de obtener datos nuevos es Dispose el contexto, crea uno nuevo y carga todo desde cero, y lo estás haciendo de todos modos.

+0

Gracias por su respuesta, estoy algo perdido, porque he leído que en mi situación preferida es exactamente lo contrario. Revisaré estos temas y regresaré. – Gleno

+0

No tendré cambios en las relaciones, ni eliminaciones en la base de datos. Comenzaré otra pregunta más tarde e intentaré explicar por qué no puedo tener un DbContext de vida corta. Realmente espero que puedan aportar algunos aportes valiosos. – Gleno

1

DbContexts se supone que viven poco tiempo, Considerar después de guardar los cambios deshacerse de él y volver a cargar todo desde el principio. Tiene 2 juegos de objetos ... uno de db y otro de enlace.

+5

que realmente no pueden hacer esto, porque entonces voy a perder el estado de interfaz de usuario en el progreso. Realmente me gustaría tener DbContext de corta vida, pero no veo cómo es posible en mi escenario. – Gleno

8

Con Entity Framework 4.1, la recomendación para el enlace de datos WPF ha cambiado para usar .Local y un DbContext persistente.

http://blogs.msdn.com/b/efdesign/archive/2010/09/08/data-binding-with-dbcontext.aspx

Es, por supuesto, es posible disponer de ella siempre que lo necesite, pero puede afectar negativamente a la interfaz de usuario si lo hace.

Aquí hay otro método, pero no estoy seguro de que tiene características de EF4.1 en cuenta:

http://msdn.microsoft.com/en-us/library/cc716735.aspx

+4

Muchas gracias, estoy muy confundido sobre el todo. Lo local. Todos y su perro me dicen que no use un solo DbContext por el motivo que sea, sin embargo, claramente proporciona esta propiedad local para el enlace a largo plazo. – Gleno

+1

@Gleno Estoy totalmente de acuerdo contigo, en mi humilde opinión la mayoría de la gente usa esto para ASP en que el contexto es de corta vida, pero para aplicaciones de escritorio es absurdo volver a cargar todo lo que ingresas a un nuevo formulario, especialmente si la información se comparte a través de varias formas tu aplicación – Hannish

0

Utilice usando() para CRUD.It volverá a cargar automáticamente los datos actualizados.

using (myDbContext context = new myDbContext()) 
{ 

} 

Best Regards, Thet Tin Oo

Cuestiones relacionadas