ASP.NET MVC Web サイトで (DbLinq を使用して) MySql の linq to sql を使用しています。奇妙なキャッシングの問題があります。私の Repository クラスで次のメソッドを検討してください。
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」は、DbLinq によって生成されたデータベースへのマッピングであり、DataContext から継承されます。ここではデータコンテキストを再利用していません (上記のコードは少しばかげているように見えますが、データコンテキストや mysqlconnection の再利用の問題ではないことを確認したかったのです)。
2 つのメソッドのどちらを呼び出しても、userId が何であれ、結果は同じままです。限目。さまざまなと の値repo.Messages
を使用して 10 を超える結果があることがわかりますが、最初にクエリを実行した結果しか返されません。したがって、呼び出すと、メッセージ A とメッセージ B が返されます。後で呼び出すと、userId が 526 のメッセージ C と Dがあるにもかかわらず、メッセージ A と B が返されます。変更を確認するには、アプリケーションを再起動する必要があります。MessageFrom
MessageTo
GetInbox(4374)
GetInbox(526)
何が起きてる?きっと誰かに指摘されたら恥ずかしくなるようなバカなことをしているに違いない。私が非常にばかげたことをしていない場合、この問題は非常に奇妙だと思います。DataContext を再利用しないことについて読みましたが、そうではありません。このキャッシュの問題はなぜですか? 以下は私のコントローラコードですが、それが問題になるとは思えません:
[Authorize]
public ActionResult Inbox(int userId)
{
Mailbox inbox = new Mailbox(userId, this.messageRepository.GetInbox(userId));
return PartialView("Inbox", inbox);
}
SO にも同様の質問がありますが、この正確な質問に対する答えは見つかりませんでした。どうもありがとう!
更新: コードを次のように変更します:return repo.Messages.ToList().Where(m => m.MessageFrom == userId);
修正すると、問題なく動作します。キャッシュの問題のようです。ただし、もちろん、そのように修正したくはありません。クエリの後にデータ コンテキストが破棄されないようにコードを変更しても、問題は解決されません。