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 に答える