EF 6.0无法使用Bounded(focused)上下文检索导航属性(Collection)

本文关键字:focused 上下文 导航 Collection 属性 检索 Bounded EF | 更新日期: 2023-09-27 17:58:14

我已经开始将我的"uber"上下文分解为更小的集中上下文。在一个简单的场景中,我有StudentLectures 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,它具有StudentHasRequired (x => x.Student)的导航属性。另一个转折点是,如果我为Registration实体保留ModelBuilder配置,但从我的聚焦上下文中删除DbSet<Registration>,那么我的Lectures导航属性将停止再次添加。(集合包含0个元素)。

我的困惑是,在我的Focused上下文中添加DbSet如何影响我为上述表/实体解析导航属性的方式?我该如何解决这个问题。任何帮助都将不胜感激。

EF 6.0无法使用Bounded(focused)上下文检索导航属性(Collection)

您只需要一个多对多映射,而不需要两个。但是,即使您可以有两个映射,它们也应该是相同的。在你的情况下,他们不是。这两个映射在MapLeftKeyMapRightKey中具有相同的列,但它们从不同的端开始。只有LectureMapper是正确的。

显然,StudentMapper优先,我认为这是由映射添加到配置的顺序决定的。结果是EF通过连接表中的StudentId值查找Lecture s:非常错误。我真的无法解释包含您所描述的其他映射和实体的效果。我只是假设在不同的情况下,EF会先进行另一个映射。

但是MapLeftKeyMapRightKey太容易出错了。我试图通过想象来把它们分开:

Lecture            HasMany    Student
Left: LectureId               Right: StudentId

MSDN描述没有太大帮助,例如MapLeftKey:

为左外键配置列的名称。左边的外键指向HasMany调用中指定的导航属性的父实体

HasMany调用中指定的导航属性是Students,该属性的父级(或所有者)是Lecture,由LectureId标识。。。我喜欢视觉效果。

UPDATE我想我解决了这个问题,但不是真的解决了。我发现,如果我删除学生和讲师多对多表上的显式映射,并让EF来做,那么现在一切都很好。

HasMany(x=>x.Students)。WithMany(y=>x.Lectures);