2011-10-05 10 views
7

Tengo un sitio que administra una colección de reglas y una aplicación de formulario de Windows por separado que realiza cambios de nivel de archivo en función de las reglas de la base de datos.Cómo forzar a EF Code First a consultar la base de datos?

Ambas aplicaciones utilizan las mismas bibliotecas para un EF Code First DbContext, pero cada aplicación crea una instancia de su propia copia del contexto.

El problema es que cada versión del contexto en ejecución no tiene conocimiento de los cambios realizados por la otra versión. P.ej. Si cambio una regla en el sitio, la aplicación de formularios todavía tiene la versión anterior.

Soy consciente de que probablemente voy por este camino equivocado, y debería tener algún tipo de acceso a los datos a través de JSON/REST desde el sitio a la aplicación de formularios, pero preferiría no hacerlo por otros motivos.

¿Hay una manera de "desactivar el almacenamiento en caché" en el contexto y la fuerza de cada consulta para golpear el PP?

Respuesta

10

No hay ninguna manera de desactivar el almacenamiento en caché. Debe establecer manualmente cada consulta en datos de reaload. Esa característica no está disponible con DbContext API => debes usar ObjectContext API.

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectSet<YourEntity> set = objectContext.CreateObjectSet<YourEntity>(); 
set.MergeOption = MergeOption.OverwriteChanges; 
var query = from x in set where ... select x;  

O más simple escenario: un mejor uso de gestión de contexto si es posible y en lugar de ejecutar consultas en el mismo contexto nos una nueva.

Btw. La idea de tener el servicio expuesto en la aplicación winform y consumirlo por el sitio web es incorrecto. Necesitaría una tercera aplicación de servicio (alojada en el servidor web o como servicio de Windows) y tanto el sitio web como la aplicación winform accederán a la base de datos a través de esa nueva aplicación. EF solo estaría en la nueva aplicación.

Editar:

Si su aplicación WinForm no hace cambios en los datos cargados desde la base de datos también puede utilizar esto:

var query = from x context.YourEntities.AsNoTracking() where ... select x; 

Esto va a desactivar el control del cambio interno de las entidades y también debería fuerza a EF a volver a cargar la entidad cada vez, pero hará que los cambios de guardado sean mucho más difíciles.

+0

Me gusta el escenario más simple :) Actualmente tengo el repositorio creado a través de DI a través del constructor. ¿Supongo que tendré que utilizarlo como arma nuclear y usar un Localizador de servicios para generar un nuevo contexto según sea necesario? – mattdwen

+0

Digamos que "YourEntity" tiene una entidad de "Usuarios" relacionada, no se actualizan con MegeOption.OverwriteChanges, ¿alguna sugerencia sobre cómo actualizar YourEntity.Users también? –

Cuestiones relacionadas