【发布时间】:2011-06-26 16:12:30
【问题描述】:
我正在使用 NHibernate 创建大量实体,将它们附加到我的 ISession,然后使用事务将我的更改提交到数据库。代码示例如下:
ISession _context = SessionProvider.OpenSession();
//Create new entities
for(int i=0; i<100; i++)
{
MyEntity entity = new MyEntity(i);
//Attach new entity to the context
_context.Save(entity);
}
//Persist all changes to the database
using(var tx = _context.BeginTransaction())
{
//Flush the session
tx.Commit();
}
我的印象是 _context.Save() 行只是让 ISession 知道新实体,但是在我通过 tx.Commit() 行刷新会话之前,不会对数据库进行任何更改。
不过,我观察到的是,每次我调用 _context.Save() 时,数据库都会获得一个新实体。结果,我最终对数据库进行了太多单独的调用。
有谁知道为什么 ISession.Save() 会自动持久化更改?我是否误解了 NHibernate 的行为方式?谢谢。
***编辑 - 只是为了澄清(根据两个建议的答案) - 我的问题是,一旦我调用 _context.Save(),数据库就会更新。我不希望发生这种情况。在调用 tx.Commit() 之前,我希望不会向数据库中插入任何内容。不幸的是,到目前为止,这两个建议的答案都没有帮助。
可以在here找到一些关于身份生成器的好信息
【问题讨论】:
-
这是预期的行为,
Save在Transaction之外执行。正确答案应该是下面的@StuffHappens。 -
@THBBFT,在事务之外不会导致保存被发送到数据库。 StuffHappens 没有给出正确答案,为什么它会在
Save电话中插入。这个答案只是确保插入将得到回滚,但这不是 OP 关心的问题。它的编辑进一步证实了这一点。
标签: nhibernate transactions isession