2010-12-06 4 views
0

Я хочу использовать сеанс SQLite для демонстрации приложения wpf; сеанс использует тестовые данные, которые ранее были созданы и сохранены в тестовом файле db3. Я связываю контекст, используя код, аналогичный тому, что я использую при нормальном тестировании - рабочий код.nhibernate текущая сессия потеряна после создания на фоновом потоке

Разница в том, что я создаю фабрику сеансов и загружаю тестовые данные в фоновый поток. В той мере, в какой это проблема, мне интересно, существует ли другой контекст, чем «поток-статический», который я использую.

Я вижу, что контекстный сеанс доступен в фоновом потоке. Код ниже. У кого-нибудь есть предложение?

============

фон нить код

контекст связан здесь, и доступен при GetCurrentSession() называется

public SqLiteDataProvider() 
    { 
     lock (padlock) 
     { 
      ... 
      var session = sessionFactory.OpenSession(); 
      CurrentSessionContext.Bind(session); 

      var pathToMother = FileHelper.GetFilePathFromDirectoryName("src", @"mother.db3"); 
      var conn = (SQLiteConnection)sessionFactory.GetCurrentSession().Connection; 
      SQLiteDataLoader.ImportData(conn, pathToMother); 

      _activitySubjectDao = new ActivitySubjectDao(sessionFactory); 
     } 

= ============

после фона работа закончена

одног е ActivitySubjectDao просят найти какие-то данные и терпит неудачу, когда он обращается к полю:

protected ISession _session { get { return _sessionFactory.GetCurrentSession(); } } 

Когда дао строится на фоне нить сеанс доступен.

==============

обновление

мне удалось получить эту работу, выделив задачу построения сеанса завода от загрузки теста файла данных и хранения заводской ссылки в вызывающем классе (и обнаружил, что я не генерировал схему SQLite в этом процессе, что нисколько не помогло).

Это похоже на довольно распространенную вещь, которую нужно делать (создание фабрики сеансов и получение данных в фоновом режиме) в настольном приложении, поэтому я все еще надеюсь, что кто-то знает более элегантное решение.

ответ

1

Я предполагаю, что текущая сессия является переменной [ThreadStatic] и, следовательно, недоступна для нового потока?