Session.CreateSqlQuery在Session.Update之后忽略更新的值

时间:2018-04-16 20:57:13

标签: c# nhibernate fluent-nhibernate

问题

我有Session.Update()更新行的状态。下一行代码是Session.CreateSqlQuery(),其中包含更复杂的更新查询。它们都在交易中,如下所示:

private void RemoveReferences(Person obj)
{
    //Session is ISession
    //Person contains multiple Activity, that can contains multiple DetailedActivity.

    using (var tx = Session.BeginTransaction())
    {
        foreach (var act in obj.Activities)
        {
            var det = Session.QueryOver<DetailedActivity>()
                .Where(w => w.Activity.CdActivity == act.CdActivity)
                .Take(1).SingleOrDefault();

            //Null validation removed...

            det.Date = null;
            det.Activity.Stage = 2; //Example of value being updated.
            Session.Update(det.Activity);
            Session.Update(det);
         }

         Session.Flush();

         //More code removed...

         //The next code is blind to any updated value from the code above.
         //For example, the value Stage still keeps its old value 
         //if I try to get if from a CreateSqlQuery.

         //Tries to remove the Person reference from the Activity.
         Session.CreateSQLQuery("Update activity ac " +
                                "Set cd_person = null " +
                                "From det_activity da " +
                                "Where ac.cd_activity = da.cd_activity " +
                                "And ac.cd_person = :cdPerson " +
                                "And Coalesce(ac.stage, 1) = 2 " +
                                "And da.Date is null;")
        .SetParameter("cdPerson", obj.CdPerson).ExecuteUpdate();

        tx.Commit();

        //Try/catch removed for brevity;
    }

这段代码是我正在使用的简化版本,但是有两个基本的代码块。

对于CreateSqlQuery来电,之前Session.Update()更新的值未被“看到”。我尝试使用activity获取CreateSqlQuery行,但仍会返回旧值。

问题

为什么CreateSqlQuery没有看到更新后的值?

有没有办法让CreateSqlQuery看到更新后的值?

1 个答案:

答案 0 :(得分:1)

如果我读得正确,你似乎误解了&#34;更新()&#34;确实。您可能需要参考参考文档:http://nhibernate.info/doc/nhibernate-reference/manipulatingdata.html#manipulatingdata-updating

当您使用刚加载的实例并希望在同一会话内更新时,正如您在此处所做的那样,只需修改对象即可。在NHibernate的脏检查和刷新阶段,更改将被发送到数据库。

Save(),Update()和SaveOrUpdate()用于新对象,或用于您希望附加到新会话的上一个会话中加载的对象。他们告诉NHibernate会话&#34;请注册这个对象以便稍后进行脏检查&#34; (在某些情况下,由于技术原因,Save()可能会立即触发INSERT,但这是副作用而非承诺)。

但是,Update()应该没有任何损害(它应该是一个无操作),并且你也明确地调用Flush(),它应该将修改传输到数据库。

所以解释必须在其他地方......

此代码中Session究竟是什么?你确定它是完全相同的会话实例吗?

如何映射类?有关刷新规则,只读属性等的任何内容吗?