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

问题描述 投票:71回答:6

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

c# entity-framework lazy-loading
6个回答
67
投票

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

context.Configuration.LazyLoadingEnabled = false;

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;
        }
    }
}

18
投票

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

假设我们有一个Product类,它具有Colour类的导航属性,你可以加载Colour这样的Product -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

15
投票

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

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

this.Configuration.LazyLoadingEnabled = false;

6
投票

在EF核心:context.ChangeTracker.LazyLoadingEnabled = false;

对于this answer


1
投票

假设你有这个:

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

尽管没有明确设置,你仍然会得到延迟加载。修复很简单,将其更改为:

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
© www.soinside.com 2019 - 2024. All rights reserved.