NHibernate为新实体生成INSERT和UPDATE

时间:2013-11-05 17:36:29

标签: nhibernate

我有一个使用Hilo生成Id列的实体。 我有一个事务,创建一个新实体并调用SaveOrUpdate()以获取Hilo生成的实体ID(我需要将该Id写入另一个DB)。

稍后,在同一个事务中,我更新了新实体,只是对一个简单属性的简单更新,最后我再次调用SaveOrUpdate()。

我看到生成的SQL命令首先是INSERT,然后是UPDATE,但我想要的只是一个包含实体最终细节的INSERT。那可能吗?我做错了什么?

编辑:添加代码示例

这是一个非常简化的伪代码示例:

Person newPerson = new Person(); // Person is a mapped entity
newPerson.Name = "foo";
_session.SaveOrUpdate(newPerson); // generates INSERT statement

newPerson.BirthDate = DateTime.Now;
_session.SaveOrUpdate(newPerson); // generates UPDATE statement

// assume session transaction was opened before and disposed correctly for sake of simplicity
_session.Transaction.Commit();

1 个答案:

答案 0 :(得分:1)

关键在于使用像NHibernate这样的ORM工具,我们采用不同的方式,然后我们使用 ADO.NET

虽然ADO.NET Commands及其Execute()方法系列会导致数据库服务器上的SQL语句立即执行...但NHibernate会有很大不同。

我们正在使用ISession。会话可以被认为是内存中的C#集合。对该对象表示执行所有Save()SaveOrUdpate()Update()Delete() ...调用。执行NO SQL命令时,在调用这些方法时,目前没有低级 ADO.NET调用。

抽象允许NHibernate根据ISession中收集的所有信息优化最终的SQL语句批处理。这就是为什么,如果使用一个Session,你将永远不会看到INSERT,UPDATE,除非我们明确地调用了神奇的Flush()或完全改变了FlushMode。

在那种情况下(调用 Flush() ,我们试图说:NHibernate我们足够聪明,现在是执行命令的时候了。在其他情况下,通常将它留在NHibernate上就足够了......

见这里: - 9.6. Flush