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; } 
} 

のようなオブジェクトを宣言しています私のモデルでは私はこの

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

EDIT

はちょうど全体のヌル/リセット戦略をテストしていた場合はnullとして保存され、それは動作しません。私のモデル内のオブジェクトへのその後のnhibernate要求は、一時オブジェクトエラーを引き起こします。

答えて

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") 

もう1つのオプションは、nullを設定するsave/afterイベントリスナーを実装することですが、子オブジェクトをリセットしますが、まだ多くの労力が必要です。

+0

私はあなたの提案のバージョンを行いました。プライベートローカル変数を使用し、ローカルプロパティを新しいインスタンスに設定した後、プロパティがnullの場合、プロパティは子の新しいインスタンスを返します。親オブジェクトに「空の」子を保存させてから、ユーザーが適切なデータを入力すると更新します。 – Josh

関連する問題