首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在填充对象之前调用了Save,为什么NHibernate会将默认值传递给insert?

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

Stack Overflow用户
提问于 2009-11-17 03:01:27
回答 3查看 371关注 0票数 0

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

代码语言:javascript
复制
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,我想遵循的模式是:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-17 03:04:33

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

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

票数 2
EN

Stack Overflow用户

发布于 2009-11-17 03:12:52

我也想知道为什么会发生这种情况。NH应该真正等待将对象插入数据库。

可以这样做的原因:

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

这真的是你为了重现测试而运行的代码吗?

映射文件是什么样子的?

票数 1
EN

Stack Overflow用户

发布于 2009-11-17 03:18:44

你刚刚在回答我的评论时提到了这一点(可能相当天真)。您已将会话FlushMode设置为Auto。将其更改为Manual,您将更有可能看到您正在寻找的行为。

这仍然是一个相当大胆的猜测,原因很简单,因为您的配置中可能有许多其他属性在起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1744146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档