假设我有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();
但我真的得到了一个对象。我只想加载第一级。
我该怎么做?
答案 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再次访问我的系统时,现在我已经预料到了行为。长话短说,我的问题是延迟加载