5

最初にPOCOエンティティとカスタムDbContextでEFモデルを使用しています。私の問題は、設定LazyLoadingEnabled=falseが何にも影響せず、ナビゲーション プロパティがまだ読み込まれていることです。以下は私の例を簡略化したものです。

エンティティ プログラム。プログラムは他のプログラムの一部になることができます:

namespace Domain.Entities
{
    using System;
    using System.Collections.Generic;

    public partial class Program
    {
        public Program()
        {
            this.Programs = new HashSet<Program>();
        }

        public int Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public System.DateTime StartDate { get; set; }
        public System.DateTime EndDate { get; set; }
        public Nullable<int> ProgramId { get; set; }

        public virtual ICollection<Program> Programs { get; set; }
        public virtual Program OwnerProgram { get; set; }
    }
}

DbContext:

namespace Infrastructure.Model
{
    public class ProgramContext : DbContext
    {
        public ProgramContext()
            : base("name=MyContainer")
        {
            Configuration.LazyLoadingEnabled = false;
        }

        public DbSet<Program> Programs { get; set; }
    }
}

これが私がそれを使用する方法です:

private ProgramContext _dbContext = new ProgramContext();

// GET api/program
public IEnumerable<Program> GetPrograms()
{
    List<Program> list = _dbContext.Programs.ToList();
    return list;
}

上記のサンプルでは、​​EF は引き続き Program クラスの Programs プロパティと OwnerProgram プロパティを読み込みます。仮想キーワードを削除して、プロキシの作成を無効にLazyLoadingEnabled=falseし、モデル自体でも確認しました。

何か不足していますか?

4

3 に答える 3

2

「EFは引き続きProgramクラスのProgramおよびOwnerProgramプロパティをロードします」

これは正しい動作ですが、ナビゲーション プロパティを遅延して読み込むのではなく、積極的に読み込みます。

これは、ナビゲーション プロパティ値を取得するために必要なデータベース クエリが、Programエンティティが取得されてナビゲーション プロパティが設定されるとすぐに実行されることを意味します。

LazyLoadingEnabledがこれらのクエリに設定されている場合true、ナビゲーション プロパティへのアクセスを試行するまでトリガーされません。これは、マウスをナビゲーション プロパティの上に置いていて、デバッガーがアタッチされている場合にも当てはまります。実際にはエンティティが遅延ロードされているのに、デバッガーがナビゲーション プロパティにアクセスしているため、エンティティが遅延ロードされていないと思われる可能性があります。 Entity Framework がそれを読み込みます。

このような SQL プロファイラーを実行して、コードをデバッグするときにクエリがいつトリガーされるかを正確に確認できます。

于 2013-05-04T12:34:02.127 に答える
0

上記のサンプルでは、​​EF は引き続き Program クラスの Programs プロパティと OwnerProgram プロパティを読み込みます。仮想キーワードを削除して、プロキシの作成を無効にし、モデル自体で LazyLoadingEnabled=false であることも確認しました。

何か不足していますか?

これらのプロパティを初期化する既定のコンストラクターを削除する必要があります。

于 2013-05-04T12:41:50.497 に答える