Estamos escribiendo una aplicación WPF utilizando Entity framework (Silverlight con servicios de RIA para ser precisos). Estamos utilizando un ObjectContext compartido a través de la aplicación para que podamos aprovechar el intercambio de datos entre los módulos.Entity Framework ObjectContext en la aplicación windows/WPF/Silverlight
El problema es que si el usuario abre durante su trabajo, digamos las ventas históricas, se carga al ObjectContext y permanece allí hasta el final de la aplicación. Entonces otro patrón debería ser usado.
Sé que ObjectContexts se debe utilizar como unidad de trabajo individual. Pero entonces, ¿cómo se permite que otras partes de la aplicación sepan que algo ha cambiado y que deberían volver a cargar sus datos?
Editar: Ok, EventAggregator, pero entonces, esto haría que todas las demás partes volvieran a cargar sus datos (probablemente la mayoría duplicados). También probablemente se necesitarían muchos eventos para todos los tipos de grupos de entidades.
¿Cómo resuelves estos problemas? Mi solución actual es una especie de compromiso: utilice un ObjectContext compartido para los datos centrales utilizados por la aplicación completa, de modo que puedan compartirse y actualizarse automáticamente. Y para la gran cantidad de datos, use un nuevo ObjectContext separado. Alguna mejor idea?
¿Hay alguna manera de "liberar" entidades de su DataContext para que Garbage collector pueda hacer su trabajo y liberar la memoria?
Con esta aplicación, estamos hablando de Silverlight. Usando Prism/Caliburn, creo que no es un problema tener un solo ObjectContext por vista (¿módulo?). De nuevo, el problema es: ¿qué pasa si hay una gran cantidad de datos para cargar al cliente? Por lo que estoy ahora, la mejor solución sería crear un ObjectContext compartido para las entidades básicas que se utilizan a través de toda la aplicación para que se sincronicen automáticamente, y ObjectContexts separados para la carga de gran cantidad de datos en, por ejemplo, algunos informes históricos. – gius
No trataría de enviar bloques de datos realmente grandes al cliente. En cambio, me gustaría filtrar en el servidor y solo devolver los resultados que el cliente quiere ver en ese momento. Los humanos no pueden leer 100,000 registros, así que no envíes tantos a un humano. En cambio, deje que el problema sea una búsqueda/filtro y solo envíe los resultados al cliente. Si está creando informes, cree los datos de resumen agregados en el servidor. Por ejemplo, sería mejor calcular el volumen de ventas mensuales en el servidor y enviar un solo número al cliente de lo que se ve a 5000 registros de ventas. –
Eso es cierto, pero si el usuario ve en cualquier momento durante la vida útil de la aplicación, digamos las páginas 1, 10 y 20, esos datos aún estarán en la memoria. Por otro lado, el uso de ObjectContext y paginación de datos separados podría resolver el problema de la gran cantidad de datos perdidos en la memoria. – gius