Как обеспечить, чтобы вызовы репозитория, использующие Entity Framework, не кэшировались? - PullRequest
0 голосов
/ 21 декабря 2011

У меня никогда не было проблем с тем, чтобы какие-либо изменения в БД не отражались, когда я делал вызов хранилища данных ранее.Но теперь это, похоже, происходит.

Раньше такие вызовы хранилища всегда были в контексте использования шаблона хранилища, где i / fs хранилища вставляются в конструкторы службы / контроллера.

У меня есть задача электронной почты, написанная как консольное приложение, содержащая цикл while (), который запрашивает базу данных для учетных записей электронной почты, а затем загружает электронную почту с соответствующих серверов.Проблема в том, что каждый раз, когда я обращаюсь к методу _emailSettingsRepo.GetAll (), все настройки устарели и не показывают никаких изменений в базе данных, даже если я вижу изменения в Management Studio.Я предполагаю, что это потому, что я использую один и тот же контекст БД, используя тот же репо внутри цикла, поэтому вызов метода GetAll () не имеет никакого значения.

Означает ли это, что кеширование никогда не было проблемой прежде, так как репозиторий и, следовательно, контекст БД создается заново каждый раз, когда в контроллер поступает новый запрос?Как мне обойти эту проблему?

1 Ответ

1 голос
/ 21 декабря 2011

Создайте контекст, когда вам это нужно, и затем утилизируйте его, например:

while (true)
{
    using (var context = new MyContext())
    {
        _emailSettingsRepo = new EmailSettingsRepo(context);
        var all = _emailSettingsRepo.GetAll();

        // Process all
    }
    // context gets disposed here,
    // garbage collection removes objects from context ("cache"),
    // next run creates new "empty" context

    bool cancelled = WaitAnHourOrCancel();
    if (cancelled)
        break;
}

Сравнивая это консольное приложение с веб-приложением в отношении управления контекстом, думайте, что каждый прогон цикла - это веб-запрос,Если вы используете контейнер IOC в своем веб-приложении (например, Ninject), вполне возможно, что контейнер создает контекст и удаляет его для вас.Но это всегда пара context = new MyContext() и context.Dispose() и обработка запроса между ними.Итак, в основном то же самое, что и блок using в примере выше.Вы просто должны сделать это прямо сейчас в своем консольном приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...