如果我在一个新对象上调用Save,然后填充它的属性,NHibernate会生成并插入只包含属性默认值的语句。例如(session是一个开放的ISession):
var homer = new Person();
session.Save(homer);
homer.Name = "Homer J. Simpson";
session.Flush();我认为调用Save会使homer持久化,并且NH会跟踪任何更改并将它们包含在插入中。相反,它会发出一个名称属性参数设置为null的插入。如果我把Save调用放在赋值之后,它就能工作。这个对象有一个由NH分配的GUID,因此它不会通过过早插入来获取标识。
我在一个ASP.NET应用程序中使用了session-per-request,我想遵循的模式是:
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发布于 2009-11-17 03:04:33
我认为你在这种情况下的假设是不正确的。
阅读您提供的代码示例,您也可以期待NHibernate插入对象,然后更改名称,然后发出更新。但是,这将假定Flush隐式保存更改后的状态。
发布于 2009-11-17 03:12:52
我也想知道为什么会发生这种情况。NH应该真正等待将对象插入数据库。
可以这样做的原因:
这真的是你为了重现测试而运行的代码吗?
映射文件是什么样子的?
发布于 2009-11-17 03:18:44
你刚刚在回答我的评论时提到了这一点(可能相当天真)。您已将会话FlushMode设置为Auto。将其更改为Manual,您将更有可能看到您正在寻找的行为。
这仍然是一个相当大胆的猜测,原因很简单,因为您的配置中可能有许多其他属性在起作用。
https://stackoverflow.com/questions/1744146
复制相似问题