【问题标题】:Using CreateSQLQuery with INSERT query in NHibernate在 NHibernate 中使用带有 INSERT 查询的 CreateSQLQuery
【发布时间】: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


【解决方案1】:

在尝试.Get 之前提交第一个事务,或者如果您只需要在更新或插入之前将此实体与另一个实体相关联,则可以使用.Load

编写原始 sql 查询不会在会话中保存内容,因为您不处理实体。

【讨论】:

  • 我有点惊讶。如果我们在同一个事务中读取,我们不应该能够读取当前待处理事务中添加的数据吗?通常我们不需要提交事务。 ExecuteUpdate 实际上只在Flush 上执行吗? (如果这是对已加载实体的 SQL 更新案例,我们将需要从会话中驱逐实体。)
  • 这取决于您在读取数据时使用的事务隔离级别。您必须将其显式设置为读取未提交的数据才能执行此操作,这是假设更新/插入实际上已在仍待处理的事务中发送到数据库。
  • 你让我怀疑,但是在已提交的begin tran; insert Parametre (Code) values ('test'); select * from parametre; rollback; select * from parametre; 中进行测试在第二种情况下产生的结果会少一个,这意味着我们不需要读取未提交的数据来读取待处理的数据,前提是我们仍在同一个事务中。在插入情况下,我不明白为什么 NHibernate 一级缓存会干扰。
  • 就我而言,最简单的解决方案是使用合并。但是,谢谢你。
【解决方案2】:

我找到了解决办法。

就我而言,ISessionProvider 具有生活方式 - perWebRequest。这意味着在结束 Web 请求之后提交会话。

接下来。插入后,我们没有实体,但我们可以将基于插入数据创建的新实体与当前会话合并。

session.Merge(new Entity(...));

或者如果您在 Persistence Context 中有父实体,则需要这样做:

session.Evict(parentEntity);
session.Merge(new Entity(...));

Evict 删除带有一些 id 的实体(孩子和父母有一些 id),否则你会得到一个异常。 这会将实体与当前会话合并,并且当您使用 sessison.Get&lt;MyObjectType&gt;(entityId) 时,对象不会为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2011-01-31
    • 2013-04-26
    • 2015-02-10
    相关资源
    最近更新 更多