【问题标题】:NHibernate CreateSQLQuery treats entities updatedNHibernate CreateSQLQuery 处理更新的实体
【发布时间】:2012-04-13 13:59:30
【问题描述】:

我正在尝试通过存储过程中的 nhibernate 的 CreateSQLQuery 从数据库中检索数据。类似于以下代码。

然后我基本上是在进行会话事务提交,但是提交会引发“无法更新”异常。它正在尝试在 CustomEntityDao 上执行更新语句。

        const string selectSQL = "EXEC GetDataSP @Id = :Id";
        var query = Session.CreateSQLQuery(selectSQL);
        query.SetString("Id", "10");
        query.AddEntity(typeof (CustomEntityDao));

        var entityList = query.List<CustomEntityDao>();

        try
        {
            Session.Transaction.Commit();
        }
        catch (Exception ex)
        {
            throw ex;
        }

我的问题是为什么实体被视为已修改,正如您在代码中看到的那样,我只是在进行查询。

【问题讨论】:

  • 您应该发布有问题的映射和实体 - 通常这是映射不匹配的标志。

标签: nhibernate


【解决方案1】:

您的代码可能还有其他问题,我可以建议使用 NHibernate Profiler 的试用版,可以从 www.nhprof.com 下载它并监控正在触发的 SQL 命令并注意哪些对象是正在检索。

我也不明白你为什么首先提交交易。

要解决这个特殊问题,您始终可以使用不跟踪实体的 NHibernates StatelessSession,或者您也可以使用 Session.Evict 并要求 Nhibernate 停止跟踪特定对象。

【讨论】:

  • 这只是一个示例代码,其中真正的代码基本上是在 http 请求级别使用 UnitOfWork 模式。事务在请求开始时开始,在 http 请求结束时提交。我将代码内联,因为它更容易理解。本质上它在做同样的事情。
  • 我在检索到的对象上使用 Sessino.Evict 来解决我遇到的问题,但我想了解到底发生了什么。
  • 我猜在你单位的某个地方你正在修改检索到的实体,这就是试图保存的东西.. 浏览你的整个流程,看看正在修改什么
猜你喜欢
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多