Luc*_*ini 4 .net c# nhibernate hibernate
我想对我在 NHibernate 上的无状态会话中使用 INSERT 命令时发现的行为发表意见(注意。我使用 NHibernate 2.1.2)
情况是这样的
//STATEFULL SESSION
var session = sessionFactory.OpenSession()
using(var transaction = session.BeginTransaction()){
var entity = new MyEntityType();
entity.Id = 1;
session.Save(entity);
var entity2 = session.Get<MyEntityType>(1);
//OK! It returns saved entity...as I expect
transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)
但是......在无状态会话中,行为发生了变化......
//STATELESS SESSION
var session = sessionFactory.OpenStatelessSession()
using(var transaction = session.BeginTransaction()){
var entity = new MyEntityType();
entity.Id = 1;
session.Insert(entity);
var entity2 = session.Get<MyEntityType>(1);
//entity2 IS NULL!!! Why?
transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是...如何检查我是否已经在无状态会话的事务范围内插入了一个项目?
好吧,无状态就是……无状态。因此,没有会话缓存可以让您从内存中返回插入的实体。
现在,为什么它没有在数据库中读取?因为还没到!
很可能您启用了批处理(adonet.batch_sizexml 配置参数,或通过代码Environment.BatchSize配置属性,或者IStatelessSession.SetBatchSize(int)在会话工厂级别启用时未禁用它)。启用批处理后,如果您的 NHibernate 数据库驱动程序支持它,DML 操作将尽可能地批处理在一起,达到配置的批处理大小,然后刷新到数据库。
因此,可能会发生这种与无状态会话的刷新:
s.GetSessionImplementation().Flush();如果您想Insert立即将其发送到数据库,请禁用批处理。将其设置为0将禁用它。
但是为什么首先要使用无状态会话?可能以有效的方式插入大量实体。在这种情况下,禁用批处理将值得您的目的。
因此,您可以改为访问由 sessionGetSessionImplementation()方法公开的内部会话接口,并显式地访问Flush它。但是,直接调用内部函数可能会产生未定义的行为,因此这不是推荐的做法。
| 归档时间: |
|
| 查看次数: |
2114 次 |
| 最近记录: |