2008-11-18 29 views
6

Khi tôi thực hiện cùng một truy vấn hai lần, lần thứ hai nó không trả lại các hàng mới tạo thành cơ sở dữ liệu (tôi đoán nó chỉ sử dụng bộ nhớ cache).Làm cách nào để buộc LINQ to SQL KHÔNG sử dụng bộ nhớ cache?

Đây là ứng dụng Biểu mẫu Windows, nơi tôi tạo dataContext khi ứng dụng bắt đầu.

Làm cách nào để buộc LINQ to SQL không sử dụng bộ nhớ cache?

Dưới đây là một hàm mẫu nơi tôi có vấn đề:

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

Trả lời

9

Cách đơn giản nhất là nên sử dụng một DataContext mới - cho rằng hầu hết những gì bối cảnh cung cấp cho bạn là bộ nhớ đệm và quản lý danh tính, nó thực sự có vẻ như bạn chỉ muốn một ngữ cảnh mới. Tại sao bạn muốn tạo một cái và sau đó giữ nó?

Bằng cách này, cho các truy vấn đơn giản như của bạn đó là dễ đọc hơn (IMO) để sử dụng "bình thường" C# với các phương pháp mở rộng chứ không phải là biểu thức truy vấn:

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

EDIT: Nếu bạn bao giờ muốn nó theo dõi thay đổi, sau đó đặt ObjectTrackingEnabled thành sai trước khi bạn thực hiện bất kỳ điều gì. Tuy nhiên, điều này sẽ hạn chế nghiêm trọng tính hữu dụng của nó. Bạn không thể chỉ lật công tắc về sau và chuyển tiếp (đã thực hiện các truy vấn giữa). Thay đổi thiết kế của bạn để tránh bối cảnh singleton sẽ tốt hơn nhiều, IMO.

+0

Đó là lúc tái cấu trúc chính cho tôi để sử dụng một DataContext khác, bởi vì nó được gói trong một thư viện khung. –

+0

Vâng, đó là những gì bạn cần làm. Khi phải đối mặt với một quyết định thiết kế tồi tệ được thực hiện trước đó, tôi thường thấy nó * nhiều hơn * tốt hơn để cuộn lên tay áo của bạn và sửa nó hơn là làm việc xung quanh nó, làm cho nó khó khăn hơn và khó khăn hơn để sửa chữa sau này. –

+0

Vâng ... đó không phải là một lựa chọn. –

0

Nó có thể quan trọng CÁCH bạn thêm một đối tượng vào DataContext để có hay không nó sẽ được bao gồm trong các truy vấn trong tương lai.

sẽ không thêm các InventoryTransaction mới về tương lai trong bộ nhớ truy vấn

Trong ví dụ này tôi thêm một đối tượng với một ID và sau đó thêm nó vào bối cảnh.

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

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

LINQ-to-SQL là không đủ thông minh để coi đây là cần phải được thêm vào danh sách lưu trữ trước đó trong mục bộ nhớ trong InventoryTransactions.

SẼ thêm InventoryTransaction mới về tương lai trong bộ nhớ truy vấn

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

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

Bất cứ nơi nào có thể sử dụng các bộ sưu tập trong LINQ-to-SQL khi tạo mối quan hệ và không phải là ID.

Ngoài Jon như đã nói, hãy cố gắng giảm thiểu phạm vi của DataContext càng nhiều càng tốt.

Các vấn đề liên quan