如何知道哪个对象是瞬态的

时间:2013-07-22 15:25:11

标签: nhibernate

使用NHibernate时出现此错误,

object references an unsaved transient instance - save the transient instance 
before    flushing: A.B.X  -  
stack trace : at NHibernate.Impl.SessionImpl.ThrowTransientObjectException(Object obj)

你怎么知道哪个物体是瞬态的?在这种情况下,A.B.X由许多其他类链接。

1 个答案:

答案 0 :(得分:0)

取决于您用于主键的内容。如果使用某个数值,则可以使用我在所有实体的基类中使用的方法:

public abstract class AbstractEntity
{
    public virtual Guid Id { get; set; }
    public virtual bool IsTransient()
    {
        return this.Id == default(Guid);
    }
}

如果您使用的是更复杂的pk,可能还有其他implications,则需要提供更复杂的检查。

编辑: 然后,如果你想在保存它们之前查看哪些实体是瞬态的,为了进行调试,如果你有某种类可以进行数据访问,比如存储库,那么在保存之前你可以遍历要保存的实体的对象图。 。它可以通过一些反射来实现,只需递归遍历实体的所有集合和属性,如果它们都从相同的基类继承并抛出它们并调用IsTransient()方法。

这有点复杂,我希望NH更准确地告诉我们哪个物体是瞬态的。