在我的ASP.NET MVC应用程序中,我启用了实体框架的延迟加载。
这意味着当我使用例如
时,它会加载来自所有项目关系的所有数据@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
db.projects;
}
在某些情况下,我不想加载所有相关数据,我只需添加.Include(x => x.Colors)
,这意味着排除了除颜色之外的所有相关数据,因为如果没有使用包含,则会加载所有相关数据。
但在一些非常罕见的情况下,我想排除所有相关数据并仅从项目中获取数据。
我想使用类似的东西:
db.projects.Exclude(x => x.All);
但这不起作用。启用lazing加载后,正确的方法是什么?
答案 0 :(得分:4)
我认为你有懒惰的装载工作有多困惑。如果您启用了延迟加载,那么当您尝试使用该属性时,您没有加载该属性的任何对象将会加载它。
使用.Include称为Eager loading,并且在抓取基础数据的同时抓取所请求的子项。
如果您不想要任何属性,那么只需调用基础对象,不要尝试访问任何子属性。
在我的MVC应用程序中,我实现了实体框架的Lazy加载 上。
这意味着当我加载所有项目关系中的所有数据时 使用例如。
这是不正确的。这将加载项目的所有基本属性。
当你尝试去访问子属性时,它会在那时进入并检索相关数据。
延迟加载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
}
延迟加载ENABLED:
@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
}
答案 1 :(得分:3)
你可以随时禁用延迟加载..
{{1}}