排除所有实体框架(延迟加载启用)

本文关键字:延迟加载 启用 框架 实体 排除 | 更新日期: 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
}