我有这段代码:
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()
之后,问题似乎消失了。仍然不知道出了什么问题。
答案 0 :(得分:2)
您正在使用会话锁定,这表示您要么在应用程序的生命周期中使用一个会话,或者您正在重复使用不是很好的会话。
您必须手动刷新以允许会话从先前的更改更新,刷新将发出未完成的插入和更新。
您应该在会话事务中包装所有查询和更新。在提交时,它将自动刷新,但它也将允许缓存,批处理和将来的查询正常工作。
nhibernate和会话生命周期管理的研究工作单元。