【问题标题】:nhibernate current session lost after creation on background thread在后台线程上创建后休眠当前会话丢失
【发布时间】:2010-12-06 12:20:39
【问题描述】:

我想使用 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 nhibernate


    【解决方案1】:

    我猜当前会话是一个 [ThreadStatic] 变量,因此对新线程不可用?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-07
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2013-12-07
      • 1970-01-01
      相关资源
      最近更新 更多