Как заставить Linq to SQL НЕ использовать кеш? - PullRequest
7 голосов
/ 19 ноября 2008

Когда я делаю один и тот же запрос дважды, второй раз он не возвращает новые строки из базы данных (я думаю, он просто использует кэш).

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 19 ноября 2008

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

Кстати, для простых запросов, подобных вашему, удобнее читать (IMO) использование «нормального» C # с методами расширения, а не с выражениями запроса:

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

РЕДАКТИРОВАТЬ: Если вы никогда не хотите, чтобы оно отслеживало изменения, установите ObjectTrackingEnabled в значение false, прежде чем что-либо делать. Однако это сильно ограничит его полезность. Вы не можете просто щелкнуть переключателем вперед и назад (сделав запросы между ними). ИМО изменил бы свой дизайн, чтобы избежать одноэлементного контекста.

0 голосов
/ 25 августа 2011

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

НЕ добавит новую транзакцию InventoryTransaction к будущим запросам памяти

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

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

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

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

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

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

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

При возможности используйте коллекции в Linq-to-SQL при создании связей, а не идентификаторы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...