如果在填充对象之前调用了Save,为什么NHibernate会将默认值传递给插入?

时间:2009-11-16 19:01:27

标签: nhibernate

如果我在新对象上调用Save,则填充其属性,NHibernate生成并插入仅包含属性默认值的语句。例如(session是一个开放的ISession):

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

我认为调用Save会使本垒打持续存在并且NH会跟踪任何更改并将它们包含在插入中。相反,它会发出一个名称属性参数设置为null的插入。如果我在分配后放置保存呼叫,那么它可以工作。这个对象有一个由NH分配的GUID 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 个答案:

答案 0 :(得分:2)

我认为你在这种情况下的假设是不正确的。

阅读您提供的代码示例,您也可以期望NHibernate插入对象,然后更改名称然后发出更新。但是,假设Flush隐式保存更改后的状态。

答案 1 :(得分:1)

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

为什么可以这样做的原因:

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

这真的是您正在运行的代码来重现测试吗?

映射文件的外观如何?

答案 2 :(得分:0)

你刚刚在答案中提到了我(也许是天真的)评论。您已将会话FlushMode设置为Auto。将其更改为Manual,您更有可能看到您正在寻找的行为。

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