我正在使用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的工作方式? 感谢。
答案 0 :(得分:0)
您可能需要使用交易
using (ITransaction transaction = session.BeginTransaction())
{
var A = new A();
var B = new B();
A.Bs.Add(B);
session.saveOrUpdate(A);
transaction.commit();
}
答案 1 :(得分:0)
所以,当你使用call A.Bs.Add(B);
NHibernate插入它时,因为可能A是一个持久对象(你已经从数据库加载它),并且它已经更新了所有依赖项。您可以使用session.Evict()从会话中分离对象,而不是使用session.saveOrUpdate(A);
进行附加。在这种情况下,插入将在此处:session.saveOrUpdate(A);
答案 2 :(得分:0)
事实上,您可能 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.所以查找事务或session.Flush调用