代码之家  ›  专栏  ›  技术社区  ›  Sisyphus

EF延迟加载已禁用,但EF仍加载完整图形

  •  1
  • Sisyphus  · 技术社区  · 7 年前

    我使用以下代码禁用了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 方法返回不带导航属性的对象,因为我已禁用延迟加载,但当我运行代码并检查变量值时,我发现导航属性也已加载!有人知道问题出在哪里吗?

    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 回复  |  直到 7 年前
        1
  •  2
  •   Sisyphus    7 年前

    事实证明,问题出在我的客户代码上。当我试图找到一个我刚刚插入的对象时,EF从它的缓存中获取它,该缓存中已经存在完整的图,因此返回完整的图。但是当我尝试查找(1)而不是查找(Insert.Id)时,它正确地返回了一个浅对象。在DbSet上使用AsNoTracking方法也得到了相同的结果。