实体框架:如何禁用特定查询的延迟加载?

Mar*_*ves 77 c# entity-framework lazy-loading

有没有办法在Entity Framework 6上禁用延迟加载特定查询?我想定期使用它,但有时我想禁用它.我正在使用虚拟属性来延迟加载它们.

Kar*_*san 70

在要执行的查询之前设置以下代码

context.Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)


Wil*_*ros 38

您可以为特定查询禁用延迟加载,如下所示:

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Par*_*ird 19

我可能在这里遗漏了一些东西,但是不是每次都改变配置,可能另一种方法.Include()只用于那些你想要加载的查询吗?

假设我们有一个Product具有导航属性的一类Colour类,您可能加载Colour了一个Product这样的-

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 它以另一种方式很有用……如果您采用这种方式,则仍然可以从“产品”中为另一个集合进行延迟加载。实际上,禁用延迟加载更为有效,以确保提前获取所需的所有数据,并避免造成隐藏的性能瓶颈。 (3认同)
  • 对我来说,这是最好的答案! (2认同)
  • 更有用的答案。这控制在构造查询时加载的特定从属表。对于任何现实世界的问题,这都必须是解决之道。 (2认同)

Jua*_*uan 15

转到图属性并找到指定为延迟加载的属性并将其禁用.

如果您首先使用代码,请转到配置区域并从那里禁用它:

this.Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)

  • 很多人都在访问这个问题而且我想说,人们不要写出有关执行计划的问题.始终知道您的代码发送到数据库的内容,否则您将遇到性能问题.您可以使用linq pad或其他工具查看真实查询和检查. (6认同)

Mat*_*ins 7

在EF Core中: context.ChangeTracker.LazyLoadingEnabled = false;

根据这个答案

  • 此处值得一提的是,除非显式配置,否则 EF core 中永远不会发生延迟加载。*然后*在个别情况下可以将其关闭。 (2认同)

fub*_*ubo 5

另一个 EF 版本(实体框架 5)的另一种方法

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 
Run Code Online (Sandbox Code Playgroud)