Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate为新实体生成插入和更新_Nhibernate - Fatal编程技术网

NHibernate为新实体生成插入和更新

NHibernate为新实体生成插入和更新,nhibernate,Nhibernate,我有一个使用Hilo生成的Id列的实体。 我有一个事务,创建一个新实体并调用SaveOrUpdate()以获取该实体的Hilo生成Id(我需要将该Id写入另一个DB) 稍后,在同一事务中,我更新了新实体,只是简单属性的简单更新,最后我再次调用SaveOrUpdate() 我看到生成的SQL命令首先是INSERT,然后是UPDATE,但我想要的只是带有实体最终细节的INSERT。可能吗?我做错什么了吗 编辑:添加代码示例 下面是一个非常简化的伪代码示例: Person newPerson = ne

我有一个使用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();

关键是,对于像NHibernate这样的ORM工具,我们的工作方式与ADO.NET不同

虽然ADO.NET
命令
及其
Execute()
方法系列会导致在DB服务器上立即执行SQL语句。。。与NHibernate相比,它有着显著的不同

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

该抽象允许NHibernate优化最终的SQL语句批处理。。。根据
会话中收集的所有信息
。这就是为什么,如果使用一个
会话
,您将永远不会看到INSERT、UPDATE,除非我们明确地调用神奇的
Flush()
或根本更改Flush模式

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

请看这里:
-关键是,对于像NHibernate这样的ORM工具,我们的工作方式与ADO.NET不同

虽然ADO.NET
命令
及其
Execute()
方法系列会导致在DB服务器上立即执行SQL语句。。。与NHibernate相比,它有着显著的不同

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

该抽象允许NHibernate优化最终的SQL语句批处理。。。根据
会话中收集的所有信息
。这就是为什么,如果使用一个
会话
,您将永远不会看到INSERT、UPDATE,除非我们明确地调用神奇的
Flush()
或根本更改Flush模式

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

请看这里:
-

我了解Flush()的机制,我只希望在同一会话中插入实体并进行更新时会出现优化行为,只会生成一条带有实体最终值的INSERT语句。这一切都取决于您的映射。如果NHibernate可以在一次插入中实现这一点,那么在大多数情况下都是这样。但老实说。。。如果您在一个事务和一个会话中。。。Save()足够调用了。因为这样,在处理瞬态对象之前,所有更改仍然应用于该“未保存”对象。fulsh将保存最终版本。如果存在要插入的显式调用。。这可能意味着,某些其他依赖项会强制执行该操作(关系)等。我了解Flush()的机制,我只希望在同一会话中插入实体并进行更新,从而实现优化行为,只有一个INSERT语句将生成实体的最终值。这一切都取决于您所拥有的映射。如果NHibernate可以在一次插入中实现这一点,那么在大多数情况下都是这样。但老实说。。。如果您在一个事务和一个会话中。。。Save()足够调用了。因为这样,在处理瞬态对象之前,所有更改仍然应用于该“未保存”对象。fulsh将保存最终版本。如果存在要插入的显式调用。。这可能意味着,其他一些依赖性会强制执行该操作(关系)等等。