Nhibernate sessionPerThread

Nhibernate sessionPerThread

我同时在多个线程中创建实体。 当我按顺序(使用一个线程)执行此操作时,一切都很好,但是当我引入并发时,几乎总是有新的异常。

我异步调用这个方法:

public void SaveNewData(){

    ....DO SOME HARD WORK....
    var data = new Data
    {            
        LastKnownName = workResult.LastKnownName
        MappedProperty = new MappedProperty
        {
           PropertyName = "SomePropertyName"
        }
    };

    m_repository.Save(data); 
    }

我已经得到这个异常:

a different object with the same identifier value was already associated with the session: 3, of entity:TestConcurrency.MappedProperty

还有这个:

Flushing during cascade is dangerous

当然还有我最喜欢的:

Session is closed!Object name: 'ISession'.

我认为发生的事情是:每个线程都有相同的会话 (nhibernateSession) 然后它...出错了,因为所有内容都尝试使用相同的会话发送查询。

对于 nhibernate 配置,我将 NhibernateIntegration 与温莎城堡结合使用。

m_repository.Save(数据) 看起来像:

  public virtual void Save(object instance)
    {
        using (ISession session = m_sessionManager.OpenSession())
        {
            Save(instance, session);
        }
    }

其中 m_sessionManager 从 Castle 注入到构造函数中,它是 ISessionManager。有什么方法可以强制此 ISessionManager 给我 SessionPerThread 或任何其他并发会话处理?

所以我研究了一下,NHibernateIntengrationFacility 似乎不支持开箱即用的事务管理。

当我更改为取代 Castle.NHibernateIntegration 的新 Castle.NHibernate.Facility 时我解决了这个问题 - 请注意,这目前只是测试版。

Castle.Nhibernate.Facility支持session-per-transaction管理,彻底解决了我的问题