LazyLoadingEnabled设置似乎在EF 5中不起作用

gix*_*xen 5 entity-framework entity-framework-5

我首先使用EF模型与POCO实体和自定义DbContexts.我的问题是设置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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

DbContext:

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

        public DbSet<Program> Programs { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何使用它:

private ProgramContext _dbContext = new ProgramContext();

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

使用上面的示例,EF仍然会加载Program类的Programs和OwnerProgram属性.我尝试删除虚拟关键字,禁用代理创建,LazyLoadingEnabled=false并在模型本身上验证了这一点.

我错过了什么吗?

Sla*_*uma 6

您看到的效果称为关系修正.

实际上,明确加载导航属性.该查询_dbContext.Programs.ToList()仅从Programs数据库加载整个表.这只是一个简单的SQL查询(如SELECT * FROM ProgramsTable),没有任何WHERE子句,也没有任何JOIN相关的行.

此外,当您访问program.Programsprogram.OwnerProgram导航属性时,此处不会发生延迟加载(如果禁用它并且禁用动态代理,则实际上不能).

当您的查询结果具体化时,将填充导航属性,因为您的查询(加载所有程序)将加载导航属性可以引用的所有程序.EF检测到那些相关实体已经在内存中并自动将它们放入导航属性中.

如果您不加载所有程序,但只能加载例如一个程序,则可以验证这一点:

Program program  = _dbContext.Programs.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

现在,program.Programsprogram.OwnerProgram将是null-除非加载的program是它自己的一部分program.OwnerProgram收藏还是自己的OwnerProgram.