实体框架:如何为特定的查询禁用延迟加载
本文关键字:查询 延迟加载 框架 实体 | 更新日期: 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;
}