EF 6.0无法使用Bounded(focused)上下文检索导航属性(Collection)
本文关键字:focused 上下文 导航 Collection 属性 检索 Bounded EF | 更新日期: 2023-09-27 17:58:14
我已经开始将我的"uber"上下文分解为更小的集中上下文。在一个简单的场景中,我有Student
和Lectures
POCOS,而我的EntityTypeConfiguration
在一个名为StudentsAndLectures
的新表中定义了两者之间的多对多关系。
这些表是在我的uber上下文中定义的表的关系网络的一部分。然而,我想以更有针对性的方式,在有重点的背景下管理学生和他们的讲座。
我的POCO课程如下。
public class Student
{
public Student()
{
Lecture = new List<Lecture>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Lecture> Lectures { get; set; }
}
public class Lecture
{
public Lecture()
{
Students = new List<Student>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Student> Students { get; set; }
}
最后,我的实体类型映射器。
public class StudentMapper : EntityTypeConfiguration<Student>
{
public StudentMapper()
{
HasKey(x => x.Id);
HasMany(x => x.Lectures)
.WithMany(x => x.Students)
.Map(m =>
{
m.MapLeftKey("LectureId");
m.MapRightKey("StudentId");
m.ToTable("StudentsAndLectures");
});
Property(x => x.Name);
}
}
public class LectureMapper : EntityTypeConfiguration<Lecture>
{
public LectureMapper()
{
HasKey(x => x.Id);
HasMany(x => x.Students)
.WithMany(x => x.Lectures)
.Map(m =>
{
m.MapLeftKey("LectureId");
m.MapRightKey("StudentId");
m.ToTable("StudentsAndLectures");
});
Property(x => x.Name);
}
}
此外,My Focused上下文包含仅适用于学生和讲师的数据库集。
我的问题是,如果我像下面这样使用我的重点上下文查询特定的学生,则我的Navigation属性将返回空。然而,如果我使用创建数据库的完整(uber)上下文,我的导航属性会按照我的意愿被惰性加载或渴望加载。有人知道为什么会这样吗?
using(FocusedStudentContext db = new FocusedStudentContext())
{
var student = db.Students.Include(s => s.Lectures)
.FirstOrDefault(s => s.StudentID == 1234);
// Inspecting student here for the Lectures navigation property
// collection has 0 elements.
}
经过进一步的测试和实验,我发现如果我的模型中包含了一个特定的(没有其他的)额外的DbSet
及其相关的ModelBuilder
配置,那么一切都很好。DbSet
代表一个实体Registration
,它具有Student
和HasRequired (x => x.Student)
的导航属性。另一个转折点是,如果我为Registration
实体保留ModelBuilder
配置,但从我的聚焦上下文中删除DbSet<Registration>
,那么我的Lectures
导航属性将停止再次添加。(集合包含0个元素)。
我的困惑是,在我的Focused上下文中添加DbSet
如何影响我为上述表/实体解析导航属性的方式?我该如何解决这个问题。任何帮助都将不胜感激。
您只需要一个多对多映射,而不需要两个。但是,即使您可以有两个映射,它们也应该是相同的。在你的情况下,他们不是。这两个映射在MapLeftKey
和MapRightKey
中具有相同的列,但它们从不同的端开始。只有LectureMapper
是正确的。
显然,StudentMapper
优先,我认为这是由映射添加到配置的顺序决定的。结果是EF通过连接表中的StudentId
值查找Lecture
s:非常错误。我真的无法解释包含您所描述的其他映射和实体的效果。我只是假设在不同的情况下,EF会先进行另一个映射。
但是MapLeftKey
和MapRightKey
太容易出错了。我试图通过想象来把它们分开:
Lecture HasMany Student
Left: LectureId Right: StudentId
MSDN描述没有太大帮助,例如MapLeftKey
:
为左外键配置列的名称。左边的外键指向HasMany调用中指定的导航属性的父实体
HasMany调用中指定的导航属性是Students
,该属性的父级(或所有者)是Lecture
,由LectureId
标识。。。我喜欢视觉效果。
UPDATE我想我解决了这个问题,但不是真的解决了。我发现,如果我删除学生和讲师多对多表上的显式映射,并让EF来做,那么现在一切都很好。
HasMany(x=>x.Students)。WithMany(y=>x.Lectures);