代码之家  ›  专栏  ›  技术社区  ›  Jamie Ide

如果在填充对象之前调用了save,那么nhibernate为什么要将默认值传递给insert?

  •  0
  • Jamie Ide  · 技术社区  · 15 年前

    如果我对一个新对象调用save,然后填充它的属性,nhibernate将生成并插入只包含属性默认值的语句。例如(会话是开放的ISession):

    var homer = new Person();
    session.Save(homer);
    homer.Name = "Homer J. Simpson";
    session.Flush();
    

    我认为调用save将使homer持久化,并且nh将跟踪任何更改并将其包含在插入中。相反,它发出一个名属性参数设置为空的插入。如果我在分配之后发出save调用,那么它就会工作。这个对象有一个由nh分配的guid id ID,所以它不会过早地进行插入来获取标识。

    eta我在ASP.NET应用程序中使用每个请求的会话,我要遵循的模式是:

    MyObject myObject;
    if (id == null)
    {
        myObject = new MyObject();
        repository.Add(myObject);
    }
    else
    {
        myObject = repository.GetMyObject(id);
    }
    // populate myObject's properties
    // NH magic happens here when the HTTP request ends
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Joseph    15 年前

    我认为你在这种情况下的假设是完全错误的。

    阅读您提供的代码示例,您也可以期望nhibernate插入对象,然后更改名称,然后发布更新。然而,这将假定flush隐式地保存更改的状态。

        2
  •  1
  •   Stefan Steinegger    15 年前

    我还想知道为什么会这样。NH应该等待将对象插入数据库。

    为什么会这样做:

    • 身份证,你已经说过你在使用guid,所以这不应该是原因。
    • 有一个查询。为了确保它是在实际数据上执行的,将刷新会话。
    • 有计算列,需要从数据库中读取这些列
    • 可能还有其他原因我不记得了。

    这真的是您运行以重现测试的代码吗?

    映射文件的外观如何?

        3
  •  0
  •   Abel    15 年前

    你刚才在我(也许相当幼稚)的评论中提到过。您已设置会话 FlushMode Auto . 把它变成 Manual 你更有可能看到你所追求的行为。

    这仍然是一个相当疯狂的猜测,仅仅是因为您配置的许多其他属性可以发挥作用。