【发布时间】: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<Student>? -
@IlyaChumakov 是的,我忘了提这个。
-
为什么要为空?它包括它们,因为无论如何它都将它们具体化,所以它是有意义的。
-
@CharlesMager 我用 Newtonsoft.Json 对其进行序列化并获得“自引用循环”。我更改了一些选项来避免这种情况,但我想以更聪明的方式做到这一点。
-
哦,好的。我认为通常您会将实体投影到某个视图模型或其他表示形式并对其进行序列化,而不是直接序列化您的实体。
标签: c# entity-framework navigation-properties