【问题标题】:Exclude all in Entity Framework (lazy loading enabled)在实体框架中排除所有(启用延迟加载)
【发布时间】:2015-10-13 19:04:59
【问题描述】:

在我的 ASP.NET MVC 应用程序中,我打开了实体框架的延迟加载。

这意味着当我使用例如它时它会加载所有项目关系中的所有数据。

@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
    db.projects;
}

当在某些情况下我不想加载所有相关数据时,我只需添加.Include(x => x.Colors),这意味着除了颜色之外的所有相关数据都被排除在外,因为如果没有使用包含,它会加载所有相关数据。

但在极少数情况下,我想排除所有相关数据并仅从项目中获取数据。

我想使用类似的东西:

db.projects.Exclude(x => x.All);

但这不起作用。启用延迟加载的正确方法是什么?

【问题讨论】:

  • 您尝试将延迟加载设置为 false 吗? db.Configuration.LazyLoadingEnabled = false;
  • 不能,因为应用有太多查询,而我需要排除所有相关数据的查询很少。
  • 你可以在你的 using 语句中逐案进行。

标签: c# asp.net-mvc performance entity-framework linq


【解决方案1】:

您可以随时禁用延迟加载..

@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

}

【讨论】:

    【解决方案2】:

    我认为您对延迟加载的工作方式感到困惑。如果您启用了延迟加载,那么当您尝试使用该属性时,您拥有的任何未加载该属性的对象都会去加载它。

    使用 .Include 被称为 Eager loading,它会在抓取基础数据的同时抓取请求的子节点。

    如果您不想要任何属性,则只需调用基础对象,不要尝试访问任何子属性。


    在我的 MVC 应用程序中,我开启了实体框架的延迟加载 开。

    这意味着当我加载所有项目关系中的所有数据时 使用例如。

    这是不正确的。这将加载项目的所有基本属性。

    当/如果您尝试访问子属性时,它会在此时访问并检索相关数据。


    延迟加载已禁用:

    @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
    
    }
    

    【讨论】:

    • 不会.ToList() 枚举对象及其子对象吗?
    • @JamieD77 不,只是对象。
    • @JamieD77 您是否在监视窗口中查看它并在展开子项时单击“枚举此”图标?您应该收到警告,表明这样做可能会影响结果。
    • 如果你这样做,没有展开结果警告ToList()
    • 也许您没有使用 POCO 类,或者没有使用加载数据(或引用子属性)的代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多