EF多关系循环加载

时间:2016-10-13 11:32:17

标签: entity-framework

假设我有EntityA,其中有多个EntityB,而EntityB可以有多个EntityA。为简单起见:

class Student
{
   public string Name {get;set;}
   public virtual ICollection<Teacher> Teachers{get;set;}
}

class Teacher
{
   public string Name {get;set;}
   public virtual ICollection<Student> Students{get;set;}
}

我做这样的映射:

HasMany(x => x.Teachers)
.WithMany(x => x.Students)
.Map(x => 
{
    x.MapLeftKey("StudentId");
    x.MapRightKey("TeacherId");
    x.ToTable("StudentTeacher");
});

启用了延迟加载。

然后我想加载包括教师在内的学生(仅指教师姓名),而不是其他学生,然后是教师库存。我试过这样的事情:

var student = _context.Students.Where(x => x.Name == studentName)
 .Include(x=>x.Teachers)
 .SingleOrDefault();

但我真的得到了一个对象。我只想加载第一级。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

这是正常行为,即使在调试它时似乎正在加载整个对象图,EF只是用初始实体填充子实体。

假设您有这些数据:

表:

学生

1 | Student1
2 | Student2

教师

1 | Teacher1
2 | Teacher2

StudentTeacher

1 | 1
1 | 2
2 | 1
2 | 2

EF查询

var student = _context.Students.Where(x => x.Name == "Student1")
 .Include(x=>x.Teachers)
 .SingleOrDefault();

给你:

student.Teachers  = ("Teacher1", "Teacher2")

student.Teachers[1].Students = ("Student1")
student.Teachers[2].Students = ("Student1")

即使每位教师都附加了"Student1",您也可以看到最后两行仅返回{"Student1", "Student2"}

答案 1 :(得分:0)

最初,当我通过Web API访问我的系统时,我看到了序列化的问题。比我配置JSON序列化程序忽略引用循环处理,它工作但部分完整的对象图,没有重复,因为JSON序列化程序处理这个。比我发现延迟加载(我假设它不是:-))。我关闭它,开始调试,在调试器中我看到了加载对象的“完整图形”,但我没想到这是调试器的功能。

所以,当我通过Web API再次访问我的系统时,现在我已经预料到了行为。长话短说,我的问题是延迟加载