Nhibernate返回错误的结果

时间:2014-04-08 10:42:55

标签: c# nhibernate linq-to-nhibernate

我有这段代码:

        lock (m_session)
        {
            var _result = m_session.Query<StaticContainerStorage>().Where(c => c.StorageId == storageName && c.ContainerId == null).FirstOrDefault();
            if (!String.IsNullOrEmpty(_result.ContainerId))
                 throw new Exception();
            if (_result == null)
            {
                _result = new StaticContainerStorage(storageName, 0);
                AddContainer(_result);
            }
            return _result;
        }

导致此查询:

select TOP (1)  mfccontain0_.ID as ID0_, 
                mfccontain0_.StorageId as StorageId0_, 
                mfccontain0_.StorageIndex as StorageI3_0_, 
                mfccontain0_.ContainerId as Containe4_0_ 
from dbo.[MfcContainerStorage] mfccontain0_ 
where mfccontain0_.StorageId=@p0 and (mfccontain0_.ContainerId is null)

返回正确的行 但是 ,返回的对象将其属性ContainerId设置为一个值,该值不为null,以便抛出异常。这里发生了什么?我有多个线程访问该方法,这就是为什么它被锁定到(单个)会话。

有什么想法吗?

修改 在查询之前添加m_session.Flush()之后,问题似乎消失了。仍然不知道出了什么问题。

1 个答案:

答案 0 :(得分:2)

您正在使用会话锁定,这表示您要么在应用程序的生命周期中使用一个会话,或者您正在重复使用不是很好的会话。

您必须手动刷新以允许会话从先前的更改更新,刷新将发出未完成的插入和更新。

您应该在会话事务中包装所有查询和更新。在提交时,它将自动刷新,但它也将允许缓存,批处理和将来的查询正常工作。

nhibernate和会话生命周期管理的研究工作单元。