【发布时间】:2016-07-23 01:08:54
【问题描述】:
如果使用 INSERT 查询添加对象,它的状态是什么?我怎样才能得到这个对象相同的会话?
使用原生 SQL 插入对象
session.CreateSQLQuery("INSERT INTO table (...) VALUES (...)").ExecuteUpdate())
我知道他的 ID,所以用这个来获取:
sessison.Get<MyObjectType>(id)
但对象为空,因为会话相同且提交仍在等待中。 我做错了什么?
附:使用 CreateSQLQuery 需要,因为我的子对象 foo 基于他的父 bar 创建,但 bar 和 foo 具有相同的 Id,并且使用 Table Per Concrete Class
【问题讨论】:
-
这对我来说看起来不正常。在原始 SQL 级别,我们可以在任何隔离级别上读取未提交的数据,前提是我们正在读取具有待处理数据的事务。检查
ExecuteUpdate,它应该立即将查询发送到数据库。你可以用探查器检查你的情况吗?然后Get应该能够找到您的新实体,除非您在某些特定情况下,例如在会话中有一个具有相同 ID 但标记为删除的陈旧实体。启用 NHibernate 调试 log4net 日志,来自DefaultLoadEventListener的日志应该会给你详细信息。 -
不,在 ExecuteUpdate 之后,分析器说 i',只发送插入,但没有提交。我认为这取决于 ISessionProvider 的生活方式
-
只是发送插入是我期望在分析器中看到的。无论如何,您的评论 here 告诉您已经找到了一些东西,您可能应该将其添加为您自己问题的答案,并接受它。或者,如果您不明白为什么您的更改会导致您的代码正常工作,也许您应该提出一个新问题。
标签: c# sql nhibernate