1

当您使用 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由许多其他类链接。

4

1 回答 1

0

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

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

如果您使用的是更复杂的 pk,这可能会产生其他影响,您将需要提供更复杂的检查。

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

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

于 2013-07-24T08:14:12.913 回答