1

Entity Framework 5 で遅延読み込みを理解するのに問題があります。遅延読み込みを使用すると、関連するエンティティが要求されるまで読み込まれないことを理解しています。

「遅延読み込みを使用する場合、最初のクエリはターゲット エンティティ セットのみを取り込みます。しかし、ナビゲーション プロパティにアクセスするたびに、ストアに対して別のクエリが発行され、関連するエンティティが読み込まれます。(参照)」

次の 2 つのクラスを持つ ASP.NET Web API プロジェクトがあります。

public class Farm
{
    public int FarmId { get; set; }
    public virtual ICollection<LandUnit> LandUnits { get; set; }
    ...
}
public class LandUnit
{
    public int LandUnitId { get; set; }
    ...
}

LazyLoadingEnabled = true を設定し、POCO クラスをガイドライン (参照) に準拠させていますが、スキャフォールディングを使用して FarmController を作成し、フィドラーを介して呼び出すと、次のように表示されます。

JSON
    {}
        ...
    LandUnits
        {}
            ...

LazyLoadingEnabled = false を設定すると、次のようになります。

JSON
    {}
        ...
    LandUnits=(null)

遅延読み込みの基本を誤解していますか? 起こっていることは、定義が述べていることの反対であるように私には思えます。遅延読み込みがオフの場合、関連するエンティティは読み込まれません。遅延読み込みがオンの場合、関連するエンティティが読み込まれます。

4

2 に答える 2

2

これは予期される動作です。JSON シリアライザーが型をシリアライズするようになると、LandUnitsナビゲーション プロパティが列挙されます。これはもちろん、データベースからそのコレクションの遅延ロードを呼び出します。

遅延読み込みをオフにしても、エンティティ フレームワークによってプロキシ タイプが生成されないため、ナビゲーション プロパティは示されているように既定値に設定されたままになります。

遅延読み込みをオフにしておくことをお勧めします。また、必要のないデータを不注意に読み込んでしまわないように、関連データを積極的にInclude( メソッドを使用して) または明示的に ( メソッドを使用して) 読み込むことをお勧めします。Load

デフォルトの JSON シリアライザーを使用する場合は、循環依存の問題にも注意する必要があります。

于 2012-12-06T00:31:48.777 に答える
0

これは、LandUnit をまだ要求していないことを示しています (foreach のようなものを使用してそれらをループすると、それらが読み込まれます)。したがって、遅延読み込みを使用すると、JSON オブジェクトは空になります。

遅延読み込みがオフになっている場合、LandUnits は読み込まれておらず、後で読み込むことができないため、LandUnits オブジェクトは null になります (そうしようとするとエラーがスローされます)。

于 2012-12-06T00:44:26.207 に答える