如果我在新对象上调用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
答案 0 :(得分:2)
我认为你在这种情况下的假设是不正确的。
阅读您提供的代码示例,您也可以期望NHibernate插入对象,然后更改名称然后发出更新。但是,假设Flush隐式保存更改后的状态。
答案 1 :(得分:1)
我也想知道为什么会这样。 NH应该等待将对象插入数据库。
为什么可以这样做的原因:
这真的是您正在运行的代码来重现测试吗?
映射文件的外观如何?
答案 2 :(得分:0)
你刚刚在答案中提到了我(也许是天真的)评论。您已将会话FlushMode
设置为Auto
。将其更改为Manual
,您更有可能看到您正在寻找的行为。
这仍然是一个相当疯狂的猜测,因为您的配置中有很多其他属性可以发挥作用。