2008-11-18 2 views
6

Когда я делаю тот же запрос дважды, второй раз, когда он не возвращает новые строки из базы данных (я предполагаю, что он просто использует кеш).Как заставить Linq to SQL НЕ использовать кеш?

Это приложение Windows Form, где я создаю dataContext при запуске приложения.

Как я могу заставить Linq to SQL не использовать кеш?

Вот пример функции, где у меня есть проблема:

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

ответ

9

Самый простой способ будет использовать новый DataContext - учитывая, что большинство из того, что контекст дает вам это кэширование и управление идентификацией, это действительно похоже, что вы просто хотите новый контекст. Почему вы хотите создать только тот, а затем удерживать его?

Кстати, для простых запросов, как у вас это более читаемым (ИМО), чтобы использовать «нормальный» C# с помощью методов расширения, а не выражений запросов:

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

EDIT: Если вы не никогда хотите его затем измените значение ObjectTrackingEnabled на false, прежде чем что-либо сделать. Однако это сильно ограничит его полезность. Вы не можете просто перевернуть переключатель назад и вперед (выполнив запросы между ними). Изменение дизайна, чтобы избежать синглтонного контекста, было бы намного лучше, ИМО.

+0

Это важный рефакторинг для меня, чтобы использовать другой DataContext, потому что он завернут в библиотеку фреймов. – 2008-11-18 22:47:39

0

Неважно, как вы добавляете объект в DataContext относительно того, будет ли он включен в будущие запросы.

не добавит новую InventoryTransaction в будущем в памяти запросов

В этом примере я добавляю объект с идентификатором, а затем добавить его в контекст.

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

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

Linq к SQL не достаточно умен, чтобы видеть это как необходимость быть добавлено к ранее сохраненному списку в памяти элементах в InventoryTransactions.

добавит новую InventoryTransaction в будущем в памяти запросов

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

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

Везде, где возможно использование коллекций в Linq-на-SQL при создании отношений, а не идентификаторы.

Кроме того, как говорит Джон, старайтесь максимально свести к минимуму объем DataContext.

Смежные вопросы