2013-10-24 2 views
4

Итак, у меня есть класс, который выглядит примерно следующим образом. Существует поток, который выполняет некоторую работу с использованием кода Entity Framework First DbContext.Entity Framework - Влияет на MultipleActiveResultSets на кеширование

Проблема, с которой я сталкиваюсь, заключается в том, что, как представляется, контекст m_DB является кешированием данных, хотя он должен быть удален и воссоздан для каждого цикла обработки.

Что я видел, так это то, что некоторые данные в отношениях отсутствуют в загруженных моделях. Если я убью и перезапустим процесс, данные будут найдены точно так же, как должно.

Единственное, что я могу придумать, это приложение использует MultipleActiveResultSets = true в строке подключения к базе данных, но я не могу найти ничего ясно из того, что это приведет к поведению, которое я вижу.

Любое понимание будет оценено по достоинству.


public class ProcessingService 
{ 

    private MyContext m_DB = null 
    private bool m_Run = true; 

    private void ThreadLoop() 
    { 
    while(m_Run) 
    { 
     try 
     { 
     if(m_DB == null) 
      m_DB = new MyContext(); 
     } 
     catch(Exception ex) 
     { 
     //Log Error 
     } 
     finally 
     { 
     if(m_DB != null) 
     { 
      m_DB.Dispose(); 
      m_DB = null; 
     } 
     } 
    } 
    } 

    private void ProcessingStepOne() 
    { 
    // Do some work with m_DB 
    } 

    private void ProcessingStepTwo() 
    { 
    // Do some work with m_DB 
    } 
} 

+0

Единственное, что кэшируется в AppDomain, это модель EF (модель хранилища, концептуальная модель и отображение), а не данные. Это действительно зависит от того, что вы делаете в цикле. Не могли бы вы показать немного больше? –

+0

Вот что я читал и понял, но я определенно получал устаревшие/кэшированные данные. Я отправил ответ на то, что, как я думаю, происходит. – raytiley

ответ

3

Несколько активных результирующих наборов или MARS является особенностью SQL 2005/2008 и ADO.NET, где одно соединение может использоваться несколькими активными наборами результатов (Подобно тому, как следует из названия). попробуйте отключить это в строке подключения и наблюдать за поведением приложения, я предполагаю, что это может быть вероятной причиной вашей проблемы. прочитайте следующую MSDN ссылку для получения дополнительной информации MARS

MSDN - Multiple Active Result Sets

Edit: Try:

var results = context.SomeEntitiy.AsNoTracking() where this = that select s; 

AsNoTracking() отключает внутренний отслеживания изменений сущностей, и она должна также заставить Entity Framework перезагрузить объекты каждый раз.

Независимо от того, что сказано и сделано, вам потребуется некоторое количество повторного факторинга, поскольку в вашем коде явно есть недостатки дизайна.

+0

Отключение MARS требует значительного рефакторинга. Я не придерживаюсь этого, но я хочу быть уверенным, что это вызовет мою проблему. Я был на этой ссылке и не могу найти ничего, что указывает, как MARS влияет на кеш dbContext. – raytiley

2

Ненавижу отвечать на свой вопрос, особенно когда у меня нет хорошего объяснения, почему он исправляет проблему.

Я закончил удаление MARS, и это решило мою проблему. Самое лучшее объяснение у меня есть:

Всегда читайте до конца результатов процедурных запросов независимо от того, возвращают ли они результаты или нет, а также для партий, которые возвращают несколько результатов. (http://technet.microsoft.com/en-us/library/ms131686.aspx)

Мое приложение не всегда прочитать все результаты вернулся, так это моя теория, что некоторые, как вызваны данные, чтобы получить кэшируются и повторно новый DbContext.

Смежные вопросы