2008-11-18 7 views
6

Wenn ich die gleiche Abfrage zweimal mache, gibt es beim zweiten Mal keine neuen Zeilen aus der Datenbank (ich denke, es verwendet nur den Cache).Wie kann ich Linq zu SQL zwingen, den Cache NICHT zu verwenden?

Dies ist eine Windows Form-Anwendung, wo ich den DataContext erstellen, wenn die Anwendung gestartet wird.

Wie kann ich Linq zu SQL zwingen, den Cache nicht zu verwenden?

Hier ist eine Beispielfunktion, wo ich das Problem:

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

Antwort

9

Der einfachste Weg, einen neuen Datacontext zu verwenden wäre - vorausgesetzt, dass das meiste, was der Kontext gibt Ihnen ist Caching und Identitätsmanagement, ist es wirklich klingt wie du willst nur einen neuen Kontext. Warum wollten Sie nur das eine erstellen und dann festhalten?

By the way, für einfache Abfragen wie das Ihre ist es besser lesbar (IMO) "normal" C# mit Erweiterungsmethoden anstatt Abfrage Ausdrücke zu verwenden:

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

EDIT: Wenn Sie nie es wollen Verfolgen Sie die Änderungen und stellen Sie dann ObjectTrackingEnabled auf false, bevor Sie etwas tun. Dies wird jedoch die Nützlichkeit stark einschränken. Sie können den Switch nicht einfach zurück- und vorspulen (nachdem Sie zwischen den Abfragen gewechselt haben). Das Ändern Ihres Designs, um den Singleton-Kontext zu vermeiden, wäre viel besser, IMO.

+0

Es ist im Wesentlichen Refactoring für mich, einen anderen DataContext zu verwenden, weil es in einer Framework-Bibliothek verpackt ist. –

+0

Nun, das ist im Grunde, was Sie tun müssen. Wenn ich mit einer schlechten Designentscheidung früher konfrontiert werde, finde ich es normalerweise viel besser, die Ärmel hochzukrempeln und zu reparieren, als um sie herum zu arbeiten, was es später schwieriger macht, sie zu reparieren. –

+0

Nun ... das ist keine Option. –

0

Es kann von Bedeutung sein, WIE Sie dem DataContext ein Objekt hinzufügen, ob es in zukünftigen Abfragen enthalten sein wird oder nicht.

wird die neue InventoryTransaction auf Zukunft im Speicher hinzufügen fragt

In diesem Beispiel habe ich mit einer ID ein Objekt bin das Hinzufügen und das Hinzufügen von es dann auf den Kontext.

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

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

Linq-to-SQL ist nicht klug genug dies als um zu sehen, in InventoryTransactions auf die zuvor zwischengespeicherte Liste der im Speicher Elementen hinzugefügt werden.

wird die neue InventoryTransaction auf Zukunft im Speicher hinzufügen abfragt

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

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

Verwenden Sie nach Möglichkeit die Sammlungen in Linq-to-SQL, wenn Beziehungen und nicht die IDs zu schaffen.

Zusätzlich, wie Jon sagt, versuchen Sie, den Umfang eines DataContext so weit wie möglich zu minimieren.

Verwandte Themen