使用NHibernate,如何在一次保存中保存所有存储库()

使用NHibernate,如何在一次保存中保存所有存储库(),nhibernate,orm,frameworks,repository,entity,Nhibernate,Orm,Frameworks,Repository,Entity,我正在使用NHibernate的项目中使用存储库/工作单元模式。我有许多存储库,例如客户和帐户。通过将相同的ISession对象传递给每个存储库的构造函数,每个存储库都与相同的ISession(工作单元模式)相关联 然后,我创建一组客户及其关联帐户,并将它们添加到各自的存储库中。现在我想将这些存储库保存到数据库中。但是,要在NHibernate中保存,需要调用ISession.save()并传入一个实体。如果我改用实体框架,并且我的会话是ObjectContext,我将能够调用ObjectCon

我正在使用NHibernate的项目中使用存储库/工作单元模式。我有许多存储库,例如客户和帐户。通过将相同的ISession对象传递给每个存储库的构造函数,每个存储库都与相同的ISession(工作单元模式)相关联

然后,我创建一组客户及其关联帐户,并将它们添加到各自的存储库中。现在我想将这些存储库保存到数据库中。但是,要在NHibernate中保存,需要调用ISession.save()并传入一个实体。如果我改用实体框架,并且我的会话是ObjectContext,我将能够调用ObjectContext.SaveChanges(),并且我所有存储库的内容都将保存到数据库中

我怎样才能在NHibernate做到这一点?我必须单独保存每个对象,而不是整个会话,这似乎很奇怪。我还必须按特定顺序保存它们,因为客户必须有一个帐户(Customer表中的AccountID FK不能为空),因此我必须先保存帐户,然后保存客户


我遗漏了什么?

您不需要显式保存对象。Hibernate的构建考虑到了所谓的“持久性无知”。只需刷新会话,对所有已知实体的所有更改都将被持久化


所以只需调用Session.Flush()

您不需要显式保存对象。Hibernate的构建考虑到了所谓的“持久性无知”。只需刷新会话,对所有已知实体的所有更改都将被持久化


所以只需调用Session.Flush()

您错过了将新对象与ISession(session.Save())关联的部分。否则NH怎么知道您创建的某个对象需要持久化?如果只修改现有对象(从ISession获取的对象),则只需提交事务/刷新会话


对于customer->account关系,您可以在其帐户上进行customer级联保存。

您错过了将新对象与ISession关联的部分(session.Save())。否则NH怎么知道您创建的某个对象需要持久化?如果只修改现有对象(从ISession获取的对象),则只需提交事务/刷新会话


对于customer->account关系,您可以在其帐户上进行customer cascade保存。

“将新对象与ISession关联”-当我将ISession传递给存储库的构造函数时,这不是已经完成了吗?因此,存储库与ISession关联,并且对象是存储库的一部分。当我Flush()时,应该保存存储库吗?是的,如果从会话中获取现有对象,则该会话将跟踪该对象。我说的是将一个新对象保存(插入)到数据库中。插入新对象的唯一方法是以某种方式调用Save(),要么在对象上调用,要么通过级联间接调用。如果对每个对象调用Save()是将新对象持久化到数据库的唯一方法,那么这就让我回到了最初的问题。我必须对每个新对象调用Save()。在我用对象填充所有存储库之后,我只想在整个会话中调用Flush()。对每个新对象调用Save()的方法调用非常多。“从会话中获取现有对象”是什么意思?您的意思是“从数据库中获取现有对象?”如果您使用的是存储库模式,那么您可能有一个
Add()
方法,该方法将调用
session.Save(entity)
?否则您将如何使用ISession实现存储库?我的存储库中有一个ICollection对象。在Add()方法中,我只是将实体添加到此集合(我使用ICollection作为实体框架IObjectSet的替代品)。我想我做得不对,我应该在isession上调用Save()。这可能解释了我的错误所在。如果这是实体框架,我在存储库中的Add()方法将只添加到IObjectSet。“将新对象与ISession关联”-当我将ISession传递给存储库的构造函数时,这不是已经完成了吗?因此,存储库与ISession关联,并且对象是存储库的一部分。当我Flush()时,应该保存存储库吗?是的,如果从会话中获取现有对象,则该会话将跟踪该对象。我说的是将一个新对象保存(插入)到数据库中。插入新对象的唯一方法是以某种方式调用Save(),要么在对象上调用,要么通过级联间接调用。如果对每个对象调用Save()是将新对象持久化到数据库的唯一方法,那么这就让我回到了最初的问题。我必须对每个新对象调用Save()。在我用对象填充所有存储库之后,我只想在整个会话中调用Flush()。对每个新对象调用Save()的方法调用非常多。“从会话中获取现有对象”是什么意思?您的意思是“从数据库中获取现有对象?”如果您使用的是存储库模式,那么您可能有一个
Add()
方法,该方法将调用
session.Save(entity)
?否则您将如何使用ISession实现存储库?我的存储库中有一个ICollection对象。在Add()方法中,我只是将实体添加到此集合(我使用ICollection作为实体框架IObjectSet的替代品)。我想我做得不对,我应该在isession上调用Save()。这可能解释了我的错误所在。如果这是实体框架,那么存储库中的我的Add()方法将只添加到IObjectSet中