EF延迟加载是禁用的,但仍然EF加载完整图形

时间:2017-09-24 12:33:55

标签: c# entity-framework lazy-loading

我已使用以下代码

禁用了延迟加载EF 6.1
public MyContext() : base("DefaultConnection")
{
    this.Configuration.LazyLoadingEnabled = false;
    this.Configuration.ProxyCreationEnabled = false;
}

然后我使用以下行加载我的对象。

T result = (T)context.Set<T>().Find(id);

其中T是我的域中具有一些导航属性的对象。我期待这个Find方法返回没有导航属性的对象,因为我已经禁用了延迟加载,但是当我运行我的代码并检查变量值时,我发现导航属性也被加载了!谁知道问题可能是什么?

修改

这是一个迷你样本

MyContext

public class MyContext : DbContext
{

    public MyContext() : base("DefaultConnection")
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }

    public DbSet<Lesson> Lessons { get; set; }
    public DbSet<Part> Parts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }

}

模型

public class Lesson
{

    public int Id { get; set; }
    public Part Part { get; set; }

}


public class Part
{

    public int Id { get; set; }

    public string Name { get; set; }
}

客户代码

            using (MyContext c = new EFTest.MyContext())
            {

                Lesson d = new EFTest.Lesson();
                d.Part = new EFTest.Part() { Name = "a" };

                Lessson insert = c.Lessons.Add(d);
                c.SaveChanges();

                Lesson returned = c.Lessons.Find(insert.Id);
            }

1 个答案:

答案 0 :(得分:2)

原来问题出在我的客户端代码上。当我尝试找到一个刚刚插入的对象时,EF会从其已存在的缓存中获取完整图形,因此返回完整的图形。但是当我尝试Find(1)而不是Find(Insert.Id)时,它正确返回了一个浅层对象。同样在DbSet上使用AsNoTracking方法产生了相同的结果。