为什么当我在包集合中添加项目时,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就是这样工作的?谢谢
因此,当您使用调用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();
}