nhibernate当前会话在后台线程上创建后丢失

时间:2010-12-06 12:20:39

标签: sqlite nhibernate

我想使用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(); } }

当dao在后台线程上构建时,会话可用。

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

更新

我设法通过将构建会话工厂的任务与加载测试数据文件的任务分开,并在调用类中保存工厂引用(并且发现我没有生成SQLite模式)来实现这一点。这个过程,甚至没有帮助。)

在桌面应用程序中,这似乎是一个相当常见的事情(构建会话工厂并在后台获取数据),所以我仍然希望有人知道更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

我猜当前会话是[ThreadStatic]变量,因此新线程无法使用?