我使用(使用DbLinq)在ASP.NET MVC网站上。我有一个奇怪的缓存问题。考虑一下我的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‘是by DbLinq生成的映射,从DataContext继承到my数据库。这里我没有重用数据文本(上面的代码看起来有点傻,但我想确保它不是数据文本/ mysqlconnection重用问题)。
所发生的事情是,无论我调用哪种方法,无论用什么userId,结果都是一样的。句号。尽管我可以看到repo.Messages有10个以上的结果,具有不同的MessageFrom和MessageTo值,但我只能得到第一个查询的结果。因此,如果我调用GetInbox(4374),它会给我消息A和消息B。然后调用GetInbox(526)仍然会给我消息A和B,尽管有消息C和D的userId值为526。我必须重新启动应用程序才能看到任何更改。
这里发生了什么事?我肯定我做了一件很愚蠢的事,当有人指给我看的时候,我会感到羞愧的。如果我不是在做一些很愚蠢的事情,那么我觉得这个问题很奇怪。我读过关于不重用DataContext的文章,但我没有。为什么会出现缓存问题?以下是我的控制器代码,但我怀疑它是否重要:
[Authorize]
public ActionResult Inbox(int userId)
{
Mailbox inbox = new Mailbox(userId, this.messageRepository.GetInbox(userId));
return PartialView("Inbox", inbox);
}虽然在这个问题上也有类似的问题,但我还没有找到这个问题的答案。非常感谢!
UPDATE:将代码更改为:return repo.Messages.ToList().Where(m => m.MessageFrom == userId);修复它,这样就可以正常工作了。好像是缓存问题。然而,我当然不想这样解决它。更改代码,以便在查询未修复问题后不释放数据文本。
发布于 2009-06-05 11:23:08
嗯,这似乎是DbLinq的问题。我使用了3周前的源代码,QueryCache中有一个明显的错误(尽管它一直在那里)。有一个完整的线程覆盖这个这里。
我更新了dblinq的消息来源。Querycache现在是禁用的(确实意味着性能受到影响),而且至少现在它可以工作了。我得看看这个表演是否可以接受。必须承认,我有点困惑,因为我试图做的是一个常见的linq2sql模式。谢谢大家。
发布于 2009-06-04 16:55:12
LINQ中的缓存与DataContext相关联,并且主要限于身份缓存--在大多数情况下,它将重新运行一个查询,即使您以前已经这样做过。有几个例子,比如.Single(x=>x.Id == id) (它有特殊的处理)。
由于您每次都要获得新的数据上下文,所以我不认为这是罪魁祸首。然而,我也有点惊讶于代码的工作.你确定那是代表吗?
LINQ的Where方法被推迟-这意味着它不会被执行,直到您迭代数据(例如,使用foreach)。但到那时,您已经处理了数据上下文!你从这个例子中剪下什么东西了吗?
而且--通过给它一个SqlConnection (而不是Dispose()),可能会影响清理--最好只给它(数据上下文)一个连接字符串。
发布于 2009-06-04 17:21:17
我写了一些非常相似的代码,看起来很好用。唯一的区别是,正如Marc所建议的,我正在传递连接字符串,并在Where方法上调用ToList。我的数据库不是自动生成的,而是从DataContext派生的。代码在下面。
class Program
{
static void Main(string[] args)
{
List<Item> first = GetItems("F891778E-9C87-4620-8AC6-737F6482CECB").ToList();
List<Item> second = GetItems("7CA18DD1-E23B-41AA-871B-8DEF6228F96C").ToList();
Console.WriteLine(first.Count);
Console.WriteLine(second.Count);
Console.Read();
}
static IEnumerable<Item> GetItems(string vendorId)
{
using (Database repo = new Database(@"connection_string_here"))
{
return repo.GetTable<Item>().Where(i => i.VendorId.ToString() == vendorId).ToList(); ;
}
}
}https://stackoverflow.com/questions/951634
复制相似问题