为什么当我在包集合中添加项目时,nhibernate会自动插入数据库

本文关键字:nhibernate 项目 数据库 插入 添加 包集合 集合 为什么 | 更新日期: 2023-09-27 18:29:49

我正在与NHibernate合作。我的A班有一袋B类物品。所以当我尝试时:

var A = new A();
var B = new B();
A.Bs.Add(B);  // Here NHibernate insert in database

Nhibernate会自动插入数据库上的关系表中。但我想在保存或更新A对象时NHibernate插入:

var A = new A();
var B = new B();
A.Bs.Add(B);
session.saveOrUpdate(A);  // Here i want to NHibernate insert in database

这是可能的,或者NHibernate就是这样工作的?谢谢

为什么当我在包集合中添加项目时,nhibernate会自动插入数据库

因此,当您使用调用A.Bs.Add(B); NHibernate插入它时,因为A可能是一个潜隐对象(您已经从数据库加载了它),并且它已经更新了所有依赖项。您可以使用会话。Evict()从会话中分离对象,然后使用session.saveOrUpdate(A);进行附加。在这种情况下,插入将在此处:session.saveOrUpdate(A);

事实上,您可能DO使用事务。因为默认情况下,NHibernate不会在将实体添加到另一个集合时进行插入。我已经在我的测试模型上检查了这种行为

Blog blog = new Blog();
blog.Name = "test";
blog.CreatedAt = DateTime.Now;
session.SaveOrUpdate(blog);
var item = new Post(blog);
blog.Posts.Add(item); // item.Id still 0 here. That mean that no insert was made

因此,请检查您的交易范围。另一个可能影响会话的刷新模式。但即使有这样的代码

Blog blog = new Blog();
session.FlushMode = FlushMode.Always;
session.SaveOrUpdate(blog);
var item = new Post(blog);
blog.Posts.Add(item);
var blogs = session.QueryOver<Blog>().List();

Id仍然为0。因此,寻找交易或会话。Flush调用

您可能需要使用事务

using (ITransaction transaction = session.BeginTransaction())
{
  var A = new A();
  var B = new B();
  A.Bs.Add(B);
  session.saveOrUpdate(A);
  transaction.commit();
}