使用 EF Code First,如何包含嵌套的嵌套数据

With EF Code First, How to include nested nested data

我有如下定义的三个实体。在我的种子方法中,我简单地向每个 class 添加一个记录,这导致一个具有 session 的扬声器有一个租户。

当我用这个具体化说话人数据时:

 List<Speaker> speakers = db.Speakers.Include("Sessions").ToList();

我得到了 Session 数据,但我还希望在 Session 记录中填充租户(这是演讲者记录的一部分)。

我无法弄清楚让 session 有租户记录的演讲者的语法。

我不确定这是否相关,但我序列化了我的 "speakers",当我反序列化它时,我错过了租户。

public DbSet<Tenant> Tenants { get; set; }
public DbSet<Speaker> Speakers { get; set; }
public DbSet<Session> Sessions { get; set; }

[Serializable]
public class Tenant
{
    public int Id { get; set; }
}

[Serializable]
public class Speaker
{
    public int Id { get; set; }

    public virtual List<Session> Sessions { get; set; } 
}

[Serializable]
public class Session
{
    public int Id { get; set; }
    public virtual Tenant Tenant { get; set; }
    public virtual List<Speaker> Speakers { get; set; } 

}

*** 回答:

List<Speaker> speakersAll1 =_context.
                            Speakers.
                            Include(a => a.Sessions.Select(b => b.Tenant)).
                            ToList();

您需要 Include 您的两个值,如下所示:

 List<Speaker> speakers = db.Speakers.Include("Sessions.Tenant").ToList();

这将包括来自您的 Session 对象的 Tenant 以及您的原始 Session 对象。

来自ObjectQuery.Include documentation

Paths are all-inclusive. For example, if an include call indicates Include("Orders.OrderLines"), not only will OrderLines be included, but also Orders.

您还可以添加 using System.Data.Entity; 以将 Include 与 lambda 表达式一起使用,这样您就不必依赖魔术字符串。