1

このように宣言されたオブジェクトがあります

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    public MyObject()
    {
        Child = new MyChild();
    }
}

public class MyChild
{
    public virtual long MyId { get; set; }
}

モデルにnullではなく空のオブジェクトが必要なため、子に「空のオブジェクト」を設定しています。

私のデータベースには、このようなテーブルがあります

CREATE TABLE MyObjects
(
    MyObjectId    bigint    IDENTITY(1,1) NOT NULL,
    ChildId       bigint    NULL
)

そして、私は私のマッピングに持っています

References<MyChild>(x => x.Child, "ChildId");

ここで問題が発生します。新しい を作成しようとすると、オブジェクトが保存されていない一時的なインスタンスを参照しているMyObjectというエラーが表示されます。だから、私はこれをしました:

var newObject = new MyObject()
{
    Child = null
};

repository.Save(newObject);

これは保存に機能しますが、現在、私のオブジェクトにはnullの子があり、これは私が望む動作ではありません. 私が使用できるハックは、新しい を作成した後に子を空にリセットするMyObjectことですが、より良い方法があるかどうかを確認したいと思います。

子はオブジェクトで null ではない必要がありますが、子オブジェクトの ID が 0 の場合は null として保存されます。

編集

null/reset 戦略全体をテストしただけで、うまくいきません。モデル内のオブジェクトに対する後続の nhibernate リクエストにより、一時的なオブジェクト エラーが発生します。

4

1 に答える 1

1

通常の使用と永続的な使用で異なる動作が必要な場合。独自の entitypersistor を実装することもできますが、これには多くの労力が必要です。私はこのような状況での回避策を好みます。これは NHibernate の仮定に違反するからです。

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    protected /*internal*/ virtual MyChild ChildForPersisting
    {
        get { return (MyChild.Id == 0) ? null : Child; }
        set { if (value != null) Child = value; }
    }

    public MyObject()
    {
        Child = new MyChild();
    }
}

// with internal
References(x => x.ChildForPersisting, "ChildId")

// without internal
References(Reveal.Member<MyChild>("ChildForPersisting"), "ChildId")

別のオプションは、子オブジェクトをnull/リセットする保存イベントリスナーの前後に実装することですが、それでも多くの労力が必要です。

于 2011-07-20T15:43:01.233 に答える