3

ドメインAとBに2つのオブジェクトがあります

オブジェクトAにはBのプロパティがありますオブジェクトBにはlistのプロパティがあります

Bのdbをヒットすると、Asのリストが返されますが、各AにはBがあり、BにはAsのリストがあります。何度も何度も。

明らかに遅延読み込みの問題。遅延読み込みがオンになっていますが、これがWCFサービスであるという問題があります。すべてのドメインオブジェクトをdtoオブジェクトに変換してネットワークに送信する必要がありますか?そうすると、次のようになります-疑似コード

ADTO adto Transform(ADomain a)
{
   adto.name = a.name;
   adto.surname = a.surname;
   adto.B = Transform(a.B);
}

BDTO bdto Transform(BDomain b)
{
   bdto.bob = b.bob;
   foreach (A a in b.As)
   {
       bdto.bs.add(Transform(a));
   }
}

では、コレクションのフェッチを1レイヤーだけ深くするにはどうすればよいですか。

Bのマッピング:

HasMany(x => x.As)
            .Cascade.AllDeleteOrphan()
            .Fetch.Select()
            .Inverse().KeyColumn("AId");

Aのマッピング:

 References(x => x.B).Column("AId");
4

1 に答える 1

1

循環参照をWCFに渡すには、IsReferenceパラメーターDataContractAttribute.IsReferenceプロパティ (またはここでは循環参照の問題を使用して親DTO(B)を調整する必要があります。

IsReferenceプロパティを使用して、オブジェクト参照情報を保持するXML構造を挿入するようにDataContractSerializerに指示します。 [DataContract(Namespace = "http://domain.../", IsReference=true)]パブリッククラスBDTO..。

あなたに答えを与えるために:

...では、コレクションのフェッチを1レイヤーだけ深くするにはどうすればよいですか。

NHibernateは循環参照に問題はありません。さらに、2つのSQLクエリのみを実行しながら、すべてのデータを簡単に取得できます。マッピングを調整します。

HasMany(x => x.As)
  .Cascade.AllDeleteOrphan()
  .BatchSize(25)
  //.Not.LazyLoad()
  .Inverse()
  .KeyColumn("AId");

注:Not.LazyLoadは、ほとんどの場合、Bを機能させるためにAオブジェクトが必要な場合にのみ意味があります。「レイジー」モードを使用する場合は、WCFサービスの処理全体を通してセッションを開いたままにしておく必要があります

BatchSize設定は、Bオブジェクトのロードリストを最適化します。詳細はこちら:http ://ayende.com/blog/3943/nhibernate-mapping-set

NHibernateセッションは2つのクエリ1)Select Bと2)を実行Select A for all Bし、結果を完全なAインスタンスとBインスタンスに具体化し、双方向の参照が完全に入力されます。NHibernateセッションは、完全にロードされたインスタンスを提供します。呼び出しGet<A>(id)てもGet<B>(id)、セッションからオブジェクトを取得します

次のステップはあなた次第です。DTOオブジェクト、マッピングツールを使用してそれらを変換できます...

于 2013-02-09T05:41:09.100 に答える