Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过NHibernate将有CRUD更改的对象的图形保存回数据库_Hibernate_Nhibernate_Fluent Nhibernate - Fatal编程技术网

通过NHibernate将有CRUD更改的对象的图形保存回数据库

通过NHibernate将有CRUD更改的对象的图形保存回数据库,hibernate,nhibernate,fluent-nhibernate,Hibernate,Nhibernate,Fluent Nhibernate,我在通过NHibernate将对象图保存到数据库中时遇到问题。具体地说,我从数据库中读取数据,使用数据初始化对象,对对象进行更改,并尝试在一个事务中通过根报表实例上的saveorupdate将对象保存到数据库中。更改可能包括对对象的添加、更新和删除操作 我想知道Nhibernate是否能够在一个事务中计算出要生成的sql命令类型(即更新、删除、插入),以及基于数据库外键约束执行的顺序 下面是我的代码: public class Report{ public virtual int Id {

我在通过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;}
}
公共类报告{
公共虚拟整数Id{get;set;}
公共虚拟IList子项{get;set;}
公共虚拟报表父级{get;set;}
公共虚拟IList参数{get;set;}
}
公共类参数{
公共虚拟整数Id{get;set;}
公共虚拟报表{get;set;}
}
报表可以包含参数、报表和父报表的集合

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

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


任何理想都会非常感激。

您没有显示太多代码,但对于Hibernate,一般来说,您所需要做的就是:

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

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

-1这是一个可怕的问题-没有显示代码或映射,没有说明进行了哪些更改,也没有给出异常的详细信息。。。尽管如此,我认为@Ryan Stewart还是设法给出了一个有用的建议answer@sJhonny如果你知道答案,你就会知道哪些领域需要改变。请给出答案或走开@Sjonny仔细阅读,提供了例外情况。请不要对某人的帖子投糟糕的一票。投票否决的可能性是为了表明某个问题没有提供信息。这里没有人为你工作,所以“要么给出答案,要么走开”的态度不是这样的。我的意思是,你的问题不清楚,很难帮助你(因此被否决)。所以你可以继续辩论否决投票,或者你可以试着提供缺失的信息,这样我才能给你答案。@Sjonny谢谢你的建议。对于我的问题,我想我提供了足够的信息。仅供参考,我只想知道NHibernate是否可以生成sql命令(CRUD)。如果我的代码有问题,我将提出另一个问题。谢谢你的建议。我是否需要在会话中执行所有操作(从db加载数据、更改对象图)。您只能在Hibernate中的会话中执行操作。如果你的意思是“在一个事务中”,那么是的,很多人认为最好的做法是在事务中放置所有持久性相关的操作,包括读取。