Ich verwende LINQ zu SQL für MySql (mit DbLinq) in einer ASP.NET MVC-Website. Ich habe ein seltsames Cache-Problem. Betrachten Sie die folgenden Methoden in meiner Repository-Klasse:DbLinq - Cache-Problem
public IEnumerable<Message> GetInbox(int userId)
{
using(MyDataContext repo = new MyDataContext(new MySqlConnection("[Connectionstring]")))
{
return repo.Messages.Where(m => m.MessageTo == userId);
}
}
public IEnumerable<Message> GetOutbox(int userId)
{
using (MyDataContext repo = new MyDataContext(new MySqlConnection("[Connectionstring]")))
{
return repo.Messages.Where(m => m.MessageFrom == userId);
}
}
‚MyDataContext‘ ist die von DbLinq erzeugte Abbildung zu meiner Datenbank, die von Datacontext erbt. Ich benutze den Datenkontext hier nicht wieder (der obige Code sieht ein bisschen albern aus, aber ich wollte absolut sicher gehen, dass es kein Problem mit datacontext/mysqlconnection wiederverwendet).
Was passiert ist, egal welche der beiden Methoden ich anrufe, mit welcher userId, die Ergebnisse bleiben gleich. Zeitraum. Obwohl ich sehen kann, dass repo.Messages
mehr als 10 Ergebnisse hat, mit variierenden Werten von MessageFrom
und MessageTo
, bekomme ich nur die zuerst abgefragten Ergebnisse zurück. Also, wenn ich rufe GetInbox(4374)
es gibt mir Nachricht A und Nachricht B. Anruf GetInbox(526)
hinterher gibt mir noch Nachricht A und B, auch wenn sind Nachrichten C und D wer tun haben eine userId von 526. Ich muss neu starten Anwendung, um Änderungen zu sehen.
Was geht hier vor? Ich bin mir sicher, dass ich etwas so Dummes mache, dass ich mich schäme, wenn mir jemand darauf hinweist. Wenn ich nicht etwas sehr dummes mache, dann finde ich dieses Thema sehr seltsam. Ich habe gelesen, dass DataContext nicht wiederverwendet wird, aber ich bin es nicht. Warum dieses Caching-Problem? Unten ist mein Controller-Code, aber ich bezweifle es ankommt:
[Authorize]
public ActionResult Inbox(int userId)
{
Mailbox inbox = new Mailbox(userId, this.messageRepository.GetInbox(userId));
return PartialView("Inbox", inbox);
}
Zwar gibt es ähnliche Fragen auf SO, habe ich nicht eine Antwort auf diese genaue Frage gefunden. Danke vielmals!
UPDATE: Ändern Sie den Code zu: return repo.Messages.ToList().Where(m => m.MessageFrom == userId);
Fixes es, es in Ordnung, dann funktioniert. Scheint wie ein Cache-Problem. Ich möchte das natürlich nicht so regeln. Ändern des Codes, so dass der Datenkontext nicht nach der Abfrage entfernt wird nicht das Problem beheben.
Das klingt vielleicht dumm, aber es hat nichts mit dem Asp.Net Caching-Mechanismus zu tun, oder? – Micah
Nun, davor hatte ich zuerst Angst. Aber innerhalb meiner MailBox-Klasse kann ich klar sehen, dass ein leerer IEnumberable übergeben wird. Oder einen mit alten Daten für diese Angelegenheit. Das ist also nicht das Problem. –
Razzie
Wenn dies DbLinq ist (aus Ihrem Kommentar), sollten Sie die Tags umbenennen und ändern; DbLinq kann wenig teilen ... die Frage nach LINQ-to-SQL wird dir nicht helfen ;-p –