使用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
由许多其他类链接。
答案 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更准确地告诉我们哪个物体是瞬态的。