我在 ASP.NET MVC 网站中使用 linq to sql for MySql(使用 DbLinq)。我有一个奇怪的缓存问题。在我的 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。我没有在这里重用 datacontext(上面的代码看起来有点傻,但我想绝对确定这不是一些 datacontext / mysqlconnection 重用问题)。
发生的情况是,无论我使用什么 userId 调用两种方法中的任何一种,结果都保持不变。时期。尽管我可以看到repo.Messages
有超过 10 个结果,并且具有不同MessageFrom
的MessageTo
值,但我只得到了第一个查询的结果。因此,如果我调用GetInbox(4374)
它会给我消息 A 和消息 B。GetInbox(526)
之后调用仍然给我消息 A 和 B,即使有消息C 和 D的用户ID 为 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);
修复它,然后它工作正常。似乎是一些缓存问题。但是,我当然不想那样修复它。更改代码以便在查询后不释放数据上下文并不能解决问题。