1

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

稍后,在同一个事务中,我更新了新实体,只是一个简单属性的简单更新,最后我再次调用 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();
4

1 回答 1

1

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

虽然 ADO.NETCommands及其Execute()方法系列会导致在数据库服务器上立即执行 SQL 语句……但 NHibernate 却截然不同。

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

这种抽象允许 NHibernate 优化最终的 SQL 语句批处理...基于在ISession. 这就是为什么,你永远不会看到 INSERT, UPDATE 如果使用 one Session,除非我们明确地调用魔法Flush()或改变 FlushMode。

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

见这里: - 9.6。冲洗

于 2013-11-06T03:19:43.940 回答