Я использую linq для sql для MySql (используя DbLinq) на веб-сайте ASP.NET MVC. У меня странная проблема кэширования. Рассмотрим следующие методы в моем классе Repository:DbLinq - Проблема с кэшем
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, у которых do есть userId из 526. Мне нужно перезагрузить приложение для просмотра любых изменений.
Что здесь происходит? Я уверен, что я делаю что-то настолько глупое, что мне будет стыдно, когда кто-то мне это скажет. Если я не делаю что-то очень глупое, то я считаю эту проблему очень странной. Я читал о том, что не повторно использую DataContext, но я нет. Почему эта проблема кеширования? Ниже мой код контроллера, но я сомневаюсь, что это имеет значение:
[Authorize]
public ActionResult Inbox(int userId)
{
Mailbox inbox = new Mailbox(userId, this.messageRepository.GetInbox(userId));
return PartialView("Inbox", inbox);
}
Хотя есть подобные вопросы на SO, я не нашел ответ на этот точный вопрос. Большое спасибо!
UPDATE: изменения кода на: return repo.Messages.ToList().Where(m => m.MessageFrom == userId);
исправляет это, он работает отлично после этого. Похоже на проблему с кешем. Тем не менее, я, конечно, не хочу это исправлять. Изменение кода так, что datacontext не удаляется после запроса не устранить проблему.
Это может показаться глупым, но это не имеет ничего общего с механизмом кэширования Asp.Net? – Micah
Ну, я сначала боялся этого. Но внутри моего класса MailBox я отчетливо вижу пустой IEnumberable. Или один со старыми данными в этом отношении. Так что это не проблема. –
Razzie
Если это DbLinq (из вашего комментария), вы должны переименовать и изменить теги; DbLinq может делиться немного ... спрашивать о LINQ-to-SQL не поможет вам ;-p –