【问题标题】:Entity Framework - Include multiple level properties实体框架 - 包括多级属性
【发布时间】:2019-02-15 21:34:09
【问题描述】:

我正在尝试使用实体框架从数据库中获取一个表。

该表引用了另一个表,该表又引用了其他表。 我知道如何包含其他表格。而根据this的回答和这个MSDN page包括多个级别是这样的:

entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3));

但我的问题是,如何在第 3 级包含另一个表?

这似乎不起作用:

entity.TableLevel1
          .Include(tLvl1=>tLvl1.TableLevel2
               .Select(tLvl2=>tLvl2.TableLevel3)
               .Select(tLvl2 => tLvl2.AnotherTableLevel3);

【问题讨论】:

  • 请给我们看表类代码。

标签: c# entity-framework


【解决方案1】:

添加另一个Include 电话:

entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3))
                  .Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.AnotherTableLevel3));

如果你想加载同一级别的相关实体,你应该为每个实体调用Include扩展方法。

【讨论】:

    【解决方案2】:

    您可以拨打多个Include() 电话:

    entity.TableLevel1.Include(t1 => t1.TableLevel2);
    entity.TableLevel1.Include(t1 => t1.TableLevel2.Select(t2 => t2.TableLevel3));
    entity.TableLevel1.Include(t1 => t1.TableLevel2.Select(t2 => t2.AnotherTableLevel3));
    

    entity.TableLevel1.Include("TableLevel2");
    entity.TableLevel1.Include("TableLevel2.TableLevel3");
    entity.TableLevel1.Include("TableLevel2.AnotherTableLevel3");
    

    但是您可以将导航属性标记为virtual,并且会延迟加载,因此您不需要进行Include() 调用:

    class TableLevel1
    {
        public virtual TableLevel2 TableLevel2 { get; set; }
    }
    
    class TableLevel2
    {
        public virtual TableLevel3 TableLevel3 { get; set; }
    
        public virtual TableLevel3 AnotherTableLevel3 { get; set; }
    }
    

    【讨论】:

    • Arturo,关于您的解决方案,我想警告您两件事。首先是您的第一个Include 调用是不必要的,该级别将加载其他两个Include 调用中的任何一个。第二件事是如果他们想在其上下文已经被释放的地方使用他们的实体,延迟加载不是一个选项,将会抛出异常。
    【解决方案3】:

    使用 EF 6.2(不是核心)这让我头疼了几个小时,才发现这不起作用的原因......

    .Include("InspectionResultsByPerspective") .Include("InspectionResultsByPerspective.InspectionResults") .Include("InspectionResultsByPerspective.InspectionResults.PreparationTasksResults")

    是因为类型 PreparationTasksResults 没有默认 ctor!!!啊!

    给它一个默认的 ctor,你可以随心所欲地加入 :) 或者对我来说是这样的

    【讨论】:

    • 这必须是代码优先的方法。如果使用数据库优先方法,则没有人关心构造函数。
    猜你喜欢
    • 2012-06-05
    • 2016-06-05
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多