2008-11-18 14 views
6

Cuando hago la misma consulta dos veces, la segunda vez no devuelve nuevas filas de la base de datos (supongo que solo usa la caché).¿Cómo puedo forzar a Linq a SQL a NO usar el caché?

Esta es una aplicación de Windows Form, donde creo el dataContext cuando se inicia la aplicación.

¿Cómo puedo forzar a Linq a SQL a no usar la caché?

Aquí es una función de ejemplo en el que tengo el problema:

public IEnumerable<Orders> NewOrders() 
{ 
    return from order in dataContext.Orders 
      where order.Status == 1 
      select order; 
} 

Respuesta

9

La forma más sencilla sería utilizar un nuevo DataContext - dado que la mayor parte de lo que el contexto le da es el almacenamiento en caché y la gestión de identidad, lo que realmente Parece que solo quieres un nuevo contexto. ¿Por qué querías crear solo una y luego aferrarte a ella?

Por cierto, para consultas sencillas como la suya que es más fácil de leer (OMI) para usar "normal" C# con los métodos de extensión en lugar de expresiones de consulta:

public IEnumerable<Orders> NewOrders() 
{ 
    return dataContext.Orders.Where(order => order.Status == 1); 
} 

EDIT: Si Nunca quiere que se sigue los cambios, luego establece ObjectTrackingEnabled en falso antes de hacer cualquier cosa. Sin embargo, esto limitará severamente su utilidad. No puedes simplemente voltear el interruptor hacia atrás y hacia adelante (habiendo hecho consultas entre). Cambiar su diseño para evitar el contexto singleton sería mucho mejor, IMO.

+0

Es en una refactorización importante para mí usar otro DataContext, porque está envuelto en una biblioteca de marcos. –

+0

Bueno, eso es básicamente lo que necesitas hacer. Cuando me enfrento a una mala decisión de diseño anterior, generalmente me parece * mucho * mejor arremangarse y arreglarlo que trabajar en él, lo que hace que sea más difícil de arreglar más tarde. –

+0

Bueno ... esa no es una opción. –

0

Puede importar cómo se agrega un objeto al DataContext en cuanto a si se incluirá o no en futuras consultas.

no añadirá el nuevo InventoryTransaction a futuro en la memoria consultas

En este ejemplo estoy añadiendo un objeto con un ID y luego agregarlo al contexto.

var transaction = new InventoryTransaction() 
       { 
        AdjustmentDate = currentTime, 
        QtyAdjustment = 5, 
        InventoryProductId = inventoryProductId 
       }; 

dbContext.InventoryTransactions.Add(transaction); 
dbContext.SubmitChanges(); 

LINQ to SQL no es lo suficientemente inteligente como para ver esto como que necesita ser añadido a la lista previamente almacenada en caché en elementos de la memoria en InventoryTransactions.

se sumará la nueva InventoryTransaction a futuro en la memoria consulta

var transaction = new InventoryTransaction() 
       { 
        AdjustmentDate = currentTime, 
        QtyAdjustment = 5 
       }; 

inventoryProduct.InventoryTransactions.Add(transaction); 
dbContext.SubmitChanges(); 

Siempre que sea posible el uso de las colecciones de LINQ to SQL al crear relaciones y no los identificadores.

Además, como dice Jon, trate de minimizar el alcance de un DataContext tanto como sea posible.