【问题标题】:EF: Include navigation property and exclude sub navigation property in same timeEF:同时包含导航属性和排除子导航属性
【发布时间】:2016-01-10 18:16:42
【问题描述】:

我有两个实体:

public class Student
{
    public int Id { get; set; }
    public virtual ICollection<Exam> PExams { get; set; }
}
public class Exam
{
    public int Id { get; set; }
    public DateTime Date { get; set; }

    public int PStudentId { get; set; }

    public virtual Student PStudent { get; set; }
}

我在 DBContext 中描述它们:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Exam>()
        .HasRequired(d => d.PStudent)
        .WithMany(d => d.PExams)
        .HasForeignKey(d => d.PStudentId);
}

我关闭了延迟加载 Configuration.LazyLoadingEnabled = false; 并在 DBContext 中为考试和学生添加了属性。

public DbSet<Exam> Exams { get; set; }
public DbSet<Student> Students { get; set; }

现在我尝试获取考试列表。

await m_DataContext.Exams.ToListAsync();

此代码为我提供了具有空属性 PStudent 的考试列表(如预期的那样)。所以我将代码更改为下一个:

await m_DataContext.Exams.Include(d=>d.PStudent).ToListAsync();

我预计我将收到带有填充属性 PStudent 的考试列表,并且 PStudent 的属性 PExams 将为空,但它有数据(考试列表)。当我包含主导航属性时,我应该更改哪些子导航属性为空?

【问题讨论】:

  • 您是否也在上下文中添加了DbSet&lt;Student&gt;
  • @IlyaChumakov 是的,我忘了提这个。
  • 为什么要为空?它包括它们,因为无论如何它都将它们具体化,所以它是有意义的。
  • @CharlesMager 我用 Newtonsoft.Json 对其进行序列化并获得“自引用循环”。我更改了一些选项来避免这种情况,但我想以更聪明的方式做到这一点。
  • 哦,好的。我认为通常您会将实体投影到某个视图模型或其他表示形式并对其进行序列化,而不是直接序列化您的实体。

标签: c# entity-framework navigation-properties


【解决方案1】:

这是预期的行为。

EF 填充加载到跟踪图中的所有导航属性。 .Include 所做的是告诉 EF 在导航属性的末尾加载实体并跟踪它,然后它会自动传播到实体中。

您已经将考试实体作为查询的一部分加载,因此链接和反向会自动填充。

我怀疑(但还没有尝试过)如果您使用 m_DataContext.Exams.AsNoTracking().Include(d=&gt;d.PStudent),则可能不会填充 reverse 属性,但这实际上取决于 AsNoTracking 在内部是如何实现的。

【讨论】:

  • 有趣,但这不起作用。感谢您对导航属性的解释工作。
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多