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

本文关键字:查询 延迟加载 框架 实体 | 更新日期: 2023-09-27 18:06:35

是否有办法为实体框架6上的特定查询禁用延迟加载?我想经常使用它,但有时我想禁用它。我使用虚拟属性来延迟加载它们

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

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

context.Configuration.LazyLoadingEnabled = false;

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

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

我可能在这里错过了一些东西,而不是每次更改配置,可能另一种方法是仅在那些想要急于加载的查询上使用.Include() ?

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

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

In EF Core: context.ChangeTracker.LazyLoadingEnabled = false;

根据这个答案

找到一个指定为延迟加载的属性并禁用它。

如果你先使用代码,然后去你的配置区,从那里禁用它:

this.Configuration.LazyLoadingEnabled = false;

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

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

假设你有:

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

你仍然会得到延迟加载,尽管显式设置了not。修复很简单,将其更改为:

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

对于EF Core,您可以使用以下帮助器来简化方法:

public static AppDbContext DisableLazyLoading(this AppDbContext dbcontext)
{
     dbcontext.ChangeTracker.LazyLoadingEnabled = false;
     return dbcontext;
}
使用<<p> /strong>
 return dbcontext.DisableLazyLoading().Branches.Find(course.BranchId);

我只是在每个需要禁用惰性加载的类中这样做,并且在每个类中只调用db而不惰性加载一切都很好

    private DataContext db;
    public TheClass ()
    {
        db = new DataContext(ConString);
        db.Configuration.LazyLoadingEnabled = false;
    } ​