为什么当我在bag collection中添加一个项目nhibernate会自动插入数据库?

时间:2012-04-03 18:32:29

标签: c# asp.net nhibernate

我正在使用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的工作方式? 感谢。

3 个答案:

答案 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调用