0

双方向の 1 対多の関係を持つ 2 つの NHibernate 管理エンティティがあります。

public class Storage
{
    public virtual string Name { get; set; }
    public virtual IList<Box> Boxes { get; set; }
}

public class Box
{
    public virtual string Box { get; set; }
    [DoNotSerialize] public virtual Storage ParentStorage { get; set; }
}

AStorageには多くの を含めることができBoxes、 a はBox常に a に属しStorageます。名前を編集したいBox'sので、JSON でクライアントに送信します。ParentStorageどのストレージにあるかを変更していないため、シリアル化しないことに注意してください。

クライアントは名前を編集し、BoxJSON として送り返します。サーバーはそれをデシリアライズしてBoxエンティティに戻します。

問題は、ParentStorageプロパティが null であることです。をデータベースに保存しようとするとBox、名前が更新されますが、 との関係も削除されStorageます。

BoxJSON データのサイズを最小限に抑えながら、 のようなエンティティを適切にシリアライズおよびデシリアライズするにはどうすればよいですか?

4

2 に答える 2

2

表示目的でDTOをクライアントに送信することをお勧めします(一意のデータベースIDが含まれている必要があります)。次に、boxId +新しい名前をクライアントからサーバーに送り返します(DTO全体を送り返す必要はありません)。サーバーは、IDを使用してデータベースルックアップを実行してボックスオブジェクトを取得し、名前フィールドをクライアントから送信されたものに更新して、ボックスをデータベースに保存できます。

このシナリオでは、NHibernateオブジェクトをシリアル化する必要はありません。これは、多くの複雑さを追加するだけで、価値はありません。

于 2010-05-07T10:41:13.973 に答える
0

遅延ロードされているため、ParentStorage は null であると推測します。熱心にフェッチされるように構成するか、シリアル化の前にゲッターを呼び出して読み取りを強制すると、ストレージがシリアル化されていることを確認するのに役立ちます。ID スキームによっては、これが機能する場合があります (確かなことはわかりません)。

この場合、シリアライゼーションによるメリットは最小限に見え、Box および Storage クラスが進化するにつれて、予期しない結果が生じる可能性があります。名前の単一の文字列を送信し、ボックスをロードし、文字列を設定して、そのオブジェクトを保存する方が簡単に思えます。そうすれば、Hibernate が下で行う最適化についてそれほど心配する必要はありません。

于 2010-05-07T05:59:23.587 に答える