实体框架 - 包含多个级别属性

Naw*_*ada 7 c# entity-framework

我试图使用实体框架从数据库中获取一个表.

该表引用了另一个表,该表再次引用了其他表.我知道如何包含其他表格.根据这个答案,这个包含多个级别的MSDN页面是这样的:

entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3));
Run Code Online (Sandbox Code Playgroud)

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

这似乎不起作用:

entity.TableLevel1
          .Include(tLvl1=>tLvl1.TableLevel2
               .Select(tLvl2=>tLvl2.TableLevel3)
               .Select(tLvl2 => tLvl2.AnotherTableLevel3);
Run Code Online (Sandbox Code Playgroud)

oct*_*ccl 19

添加另一个Include电话:

entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3))
                  .Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.AnotherTableLevel3));
Run Code Online (Sandbox Code Playgroud)

如果要加载相同级别的相关实体,则应Include为每个实体调用 扩展方法.


Art*_*aca 6

你可以打多个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));
Run Code Online (Sandbox Code Playgroud)

要么

entity.TableLevel1.Include("TableLevel2");
entity.TableLevel1.Include("TableLevel2.TableLevel3");
entity.TableLevel1.Include("TableLevel2.AnotherTableLevel3");
Run Code Online (Sandbox Code Playgroud)

但是您可以将导航属性标记为virtual延迟加载,因此您无需Include()拨打电话:

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

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

    public virtual TableLevel3 AnotherTableLevel3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 阿图罗,有两件事我想警告你关于你的解决方案.第一件事是你的第一个`Include`调用是不必要的,该级别将被加载任何其他两个'Include`调用.第二件事是如果他们想要在已经处理了它的上下文的地方使用它们的实体,则不能选择延迟加载,抛出异常. (4认同)