3

作業単位/リポジトリ パターンで Entity Framework 4.3 を使用しています。この場合、作業単位はリクエストです。

また、作業単位は明示的に遅延読み込みを true に設定します。

ただし、このシナリオで物事がいつ遅延ロードされるかについて少し混乱しています。アドバイスをいただければ幸いです。

    var context = Local.Items.Uow.Context; // the context

    var r = new ReadRepo<Deal>(context); // the repository

    var deals = r.Find(); // IQueryable<Deal>

    Rpt_BookmarkedDeals.DataSource = deals.ToList();
    Rpt_BookmarkedDeals.DataBind();

リポジトリ取引には、「ストア」のナビゲーション プロパティがあります。Store をロードする要件は、リピーターがデータバインドされている場合にのみ認識されます。これは nav プロパティが読み込まれる場所だと思いますが、よくわかりません。

これはこれを行う最善の方法ですか、それとも取引を取得するときに Store を Include() として明示的に追加する必要がありますか?

4

1 に答える 1

4

Store をロードする要件は、リピーターがデータバインドされている場合にのみ認識されます。これは nav プロパティが読み込まれる場所だと思いますが、よくわかりません。

はい、遅延ロードされたナビゲーション プロパティは、プロパティが参照されると読み込まれ、そのプロパティへのバインディングがそれを参照します。

これはこれを行う最善の方法ですか、それとも取引を取得するときに Store を Include() として明示的に追加する必要がありますか?

最善の方法は 1 つではありません。

取引が 10 の異なる店舗にリンクしている場合、遅延読み込みdeal.Storeにより、取引を取得する 1 つのクエリに加えて、10 の個別のクエリがデータベースに送信されます。を使用するdeals.Include("Store")と、1 つのクエリで取引と店舗の両方が一度に取得されますが、各店舗のデータは取引ごとに繰り返されます。どちらがより良いパフォーマンスを発揮するかは異なります。

遅延読み込みを使用すると、取引が読み込まれた後、店舗が削除される前に店舗とその取引が削除されると、矛盾が生じる可能性があります。これはトランザクションを使用することで回避できますが、その場合、ストアがロードされるまでトランザクションを継続する必要があります。

さまざまな方法の長所と短所を比較検討して、状況に最適な方法を決定する必要があります。

于 2012-09-07T10:29:55.247 に答える