有没有办法在Entity Framework 6的特定查询中禁用延迟加载?我想要经常使用它,但有时我想禁用它。我正在使用虚拟属性来进行延迟加载。
有没有办法在Entity Framework 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();
context.ChangeTracker.LazyLoadingEnabled = false;
根据这个答案。前往您的图表属性,找到一个指定为懒加载的属性并将其禁用。
如果您正在使用 Code First,则请转至配置区域并通过以下方式在那里禁用它:
this.Configuration.LazyLoadingEnabled = false;
另一种处理EF版本(Entity Framework 5)的方法
//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false;
如果您想要使用一种简单的方法来使用EF Core,您可以使用以下辅助工具:
public static AppDbContext DisableLazyLoading(this AppDbContext dbcontext)
{
dbcontext.ChangeTracker.LazyLoadingEnabled = false;
return dbcontext;
}
使用
return dbcontext.DisableLazyLoading().Branches.Find(course.BranchId);
AsNoTracking
,它确实会改变一个查询的行为)。实际上,它只是像启用惰性加载一样执行查询,但它在其余的生命周期中关闭了上下文的惰性加载。它的使用方式是具有欺骗性的。 - Gert ArnoldIOrderedQueryable<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();
}
private DataContext db;
public TheClass ()
{
db = new DataContext(ConString);
db.Configuration.LazyLoadingEnabled = false;
}
this.Configuration.LazyLoadingEnabled = false;
,然后再将其设置为this.Configuration.LazyLoadingEnabled = true;
吗?此外,你还可以阅读http://msdn.microsoft.com/en-us/data/jj574232.aspx。 - user1477388