保存CRUD更改的对象图,通过NHibernate返回数据库

时间:2011-08-22 23:09:22

标签: hibernate nhibernate fluent-nhibernate

我在通过NHibernate将对象图保存到数据库时遇到问题。具体来说,我从数据库中读取数据,使用数据初始化对象,更改对象,并尝试在一个事务中通过根报表实例上的saveorupdate将对象保存到数据库中。更改可能包括对对象的添加,更新和删除操作。

我想知道Nhibernate是否能够在一个事务中找出要生成的sql命令类型(即更新,删除,插入)以及基于数据库外键约束执行的序列

以下是我的代码:

public class Report{
   public virtual int Id {get;set;}
   public virtual IList<Report> Children {get;set;}
   public virtual Report Parent {get;set;}
   public virtual IList<Parameter> Parameters {get;set;}
}

public class Parameter{
   public virtual int Id {get;set;}
   public virtual Report Report {get;set;}
}

报告可以包含参数,报告和父报告的集合。

根据从数据库中检索到的数据进行初始化后,对对象图进行更改,并尝试使用NHibernate Session.SaveOrUpdate()传递根报表实例将其保存到数据库中。但是,它抛出异常,说无法在id列中插入null。

修改 我只想知道NHibernate是否可以生成sql命令(CRUD)。如果我的代码有问题,我会打开另一个问题。

非常感谢任何理想。

1 个答案:

答案 0 :(得分:2)

你还没有展示出很多代码,但是对于Hibernate,一般来说,你要做的就是:

start transaction
load your objects
make whatever changes to the loaded objects
commit transaction

请注意,缺少对Save()或SaveOrUpdate()的调用。在使用Hibernate Session加载对象之后,该对象仍然附加到会话,并且对其进行的任何更改将在提交时传播回数据库。添加到现有(持久)图中的新对象需要保存,可以直接将对象传递给Session.Save(),也可以让它沿着关系级联。