NHibernate CreateSQLQuery处理更新的实体

NHibernate CreateSQLQuery处理更新的实体,nhibernate,Nhibernate,我试图通过nhibernate在存储过程上的CreateSQLQuery从数据库检索数据。类似于下面的代码 然后,我基本上是在执行会话事务提交,但是提交会引发一个“无法更新”异常。它试图在CustomEntityDao上执行update语句 const string selectSQL = "EXEC GetDataSP @Id = :Id"; var query = Session.CreateSQLQuery(selectSQL); query

我试图通过nhibernate在存储过程上的CreateSQLQuery从数据库检索数据。类似于下面的代码

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

        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;
        }
const string selectSQL=“EXEC GetDataSP@Id=:Id”;
var query=Session.CreateSQLQuery(selectSQL);
query.SetString(“Id”,“10”);
query.AddEntity(typeof(CustomEntityDao));
var entityList=query.List();
尝试
{
Commit();
}
捕获(例外情况除外)
{
掷骰子;
}

我的问题是,为什么实体被视为“修改的”
,正如您在代码中看到的,我只是在做一个查询。

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

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


要解决此特定问题,您可以始终使用不跟踪实体的NHibernates
无状态会话
,也可以使用
会话。退出
并要求Nhibernate停止跟踪特定对象。

您应该发布有问题的映射和实体-通常这是映射不匹配的迹象。这只是一个问题示例代码,其中实际代码基本上在http请求级别使用UnitOfWork模式。事务在请求开始时启动,在http请求结束时提交。我把代码内联,因为它更容易理解。从本质上讲,它也在做同样的事情。我正在使用sessionno.execute对检索到的对象进行处理,以解决我遇到的问题,但我想了解到底发生了什么。我猜您所在的部门中的某个地方正在修改检索到的实体,这就是试图保存的内容。。浏览整个流程,看看修改了什么