排除所有实体框架(延迟加载启用)
本文关键字:延迟加载 启用 框架 实体 排除 | 更新日期: 2023-09-27 18:17:27
. NET MVC应用程序,我有延迟加载实体框架打开。
这意味着当我使用例如
时,它会加载所有项目关系中的所有数据。@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
db.projects;
}
在某些情况下,当我不想加载所有相关数据时,我只需添加.Include(x => x.Colors)
,这意味着除了颜色之外的所有相关数据都被排除在外,因为如果没有使用include,它会加载所有相关数据。
但是在一些非常罕见的情况下,我想排除所有相关数据,只从项目中获取数据。
我想使用如下格式:
db.projects.Exclude(x => x.All);
但这不起作用。启用延迟加载的正确方法是什么?
您可以随时禁用延迟加载。
@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
db.Configuration.LazyLoadingEnabled = false;
var projects = db.projects; // no related data available
db.Configuration.LazyLoadingEnabled = true;
var projects = db.projects; // related data available
}
我想你已经对延迟加载的工作方式感到困惑了。如果你启用了延迟加载,那么当你试图使用该属性时,任何你没有加载该属性的对象都会去加载它。
使用。include被称为Eager loading,它会在抓取基数据的同时抓取被请求的子数据。
如果你不想要任何属性,那么只调用基对象,不要尝试访问任何子属性。
在我的MVC应用程序中,我有实体框架的延迟加载
。这意味着它加载所有项目关系中的所有数据如使用。
这是错误的。将加载项目的所有基本属性。
当/IF你试图去访问一个子属性时,它会在那个时候去检索相关的数据。
With lazy loading DISABLED:
@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
var results=db.projects.ToList();
// results[0].Children is empty at this point
var child=results[0].Children; // child is empty
}
启用延迟加载:
@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
var results=db.projects.ToList();
// results[0].Children is empty at this point
var child=results[0].Children; // This causes a DB lookup to get the children
}
动态加载:
@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
var results=db.projects.Include(x=>Children).ToList();
// results[0].Children is already in memory
var child=results[0].Children; // This doesn't cause a DB lookup, and the data is returned from memory
}