首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DbLinq -缓存问题

DbLinq -缓存问题
EN

Stack Overflow用户
提问于 2009-06-04 16:24:29
回答 5查看 1K关注 0票数 0

我使用(使用DbLinq)在ASP.NET MVC网站上。我有一个奇怪的缓存问题。考虑一下我的Repository类中的以下方法:

代码语言:javascript
复制
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个以上的结果,具有不同的MessageFromMessageTo值,但我只能得到第一个查询的结果。因此,如果我调用GetInbox(4374),它会给我消息A和消息B。然后调用GetInbox(526)仍然会给我消息A和B,尽管有消息C和D的userId值为526。我必须重新启动应用程序才能看到任何更改。

这里发生了什么事?我肯定我做了一件很愚蠢的事,当有人指给我看的时候,我会感到羞愧的。如果我不是在做一些很愚蠢的事情,那么我觉得这个问题很奇怪。我读过关于不重用DataContext的文章,但我没有。为什么会出现缓存问题?以下是我的控制器代码,但我怀疑它是否重要:

代码语言:javascript
复制
[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);修复它,这样就可以正常工作了。好像是缓存问题。然而,我当然不想这样解决它。更改代码,以便在查询未修复问题后不释放数据文本。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-05 11:23:08

嗯,这似乎是DbLinq的问题。我使用了3周前的源代码,QueryCache中有一个明显的错误(尽管它一直在那里)。有一个完整的线程覆盖这个这里

我更新了dblinq的消息来源。Querycache现在是禁用的(确实意味着性能受到影响),而且至少现在它可以工作了。我得看看这个表演是否可以接受。必须承认,我有点困惑,因为我试图做的是一个常见的linq2sql模式。谢谢大家。

票数 1
EN

Stack Overflow用户

发布于 2009-06-04 16:55:12

LINQ中的缓存与DataContext相关联,并且主要限于身份缓存--在大多数情况下,它将重新运行一个查询,即使您以前已经这样做过。有几个例子,比如.Single(x=>x.Id == id) (它有特殊的处理)。

由于您每次都要获得新的数据上下文,所以我不认为这是罪魁祸首。然而,我也有点惊讶于代码的工作.你确定那是代表吗?

LINQ的Where方法被推迟-这意味着它不会被执行,直到您迭代数据(例如,使用foreach)。但到那时,您已经处理了数据上下文!你从这个例子中剪下什么东西了吗?

而且--通过给它一个SqlConnection (而不是Dispose()),可能会影响清理--最好只给它(数据上下文)一个连接字符串。

票数 1
EN

Stack Overflow用户

发布于 2009-06-04 17:21:17

我写了一些非常相似的代码,看起来很好用。唯一的区别是,正如Marc所建议的,我正在传递连接字符串,并在Where方法上调用ToList。我的数据库不是自动生成的,而是从DataContext派生的。代码在下面。

代码语言:javascript
复制
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(); ;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/951634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档