NHibernate代码 - 使用未保存的(瞬态)子实体保存实体

时间:2016-06-08 13:26:00

标签: c# nhibernate nhibernate-mapping

我有以下实体:

<div class="row" ng-app="roomsApp">

在实体映射中我有:

public class Item
{
public virtual long ID { get; set; }
public virtual Version Version { get; set;}
More properties...
}

实体ManyToOne(p => p.Version, m => { m.Column("VERSION_ID"); } 也由代码映射,它的ID是自动生成的序列。 保存Version后,我创建了一个新的Item,将其分配给Version属性并保存。我想在Version成功保存后才保存Version实体。现在,当我这样做时,它会抛出一个Item。有可能解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您无法通过映射属性(Item-&gt; Version)保存引用瞬态对象的实体,除非在映射属性时指定Cascade.Persist或Cascade.All。

另一件事是,由于您应该在事务中运行该代码,因此插入顺序无关紧要。如果在保存版本之后但在保存项目之前抛出异常(或发生任何其他错误),则应回滚事务,并且没有人会看到新版本。

下面的代码段显示了如何使用nHibernate开始/提交事务。请注意,如果事务在处理之前没有被提交,那么事务将被回滚。

using(var session = sessionFactory.OpenSession())
using(var transaction = session.BeginTransaction())
{
     // Do your thing here...

     transaction.Commit();
}