NHibernate by code - 使用未保存的(瞬态)子实体保存实体

NHibernate by code - Save entity with unsaved(transient) child entity

我有以下实体:

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");
}

实体Version也是由代码映射的,它的ID是一个自动生成的序列。 当我保存 Item 时,我创建了一个新的 Version,将其分配给 Version 属性 并保存。我只想在 Item 成功保存后才保存 Version 实体。现在当我这样做时它会抛出 TransientObjectException。有可能解决这个问题吗?

您不能通过映射 属性(项目-> 版本)保存引用临时对象的实体,除非在映射 属性 时指定 Cascade.Persist 或 Cascade.All.

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

下面的代码片段显示了如何 begin/commit 使用 nHibernate 进行交易。请注意,如果事务在处理前未提交,则会回滚。

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

     transaction.Commit();
}