Текущий сеанс nhibernate потерян после создания в фоновом потоке - PullRequest
0 голосов
/ 06 декабря 2010

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

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

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

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

код фоновой нити

контекст здесь привязан и доступен, когда вызывается 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 Ответ

1 голос
/ 06 декабря 2010

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

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