C# EF 6.0无法使用有界(聚焦)上下文检索导航属性(集合)

C# EF 6.0无法使用有界(聚焦)上下文检索导航属性(集合),c#,entity-framework,bounded-contexts,C#,Entity Framework,Bounded Contexts,我已经开始将我的“优步”环境分解成更小的专注环境。在一个简单的场景中,我有学生和讲座POCO,我的EntityTypeConfiguration在一个名为学生和讲座的新表中定义了两者之间的多对多关系 这些表是在我的uber上下文中定义的表关系网络的一部分。然而,我想以一种更有针对性的方式,在有重点的环境下管理学生和他们的讲座 下面是我的POCO课程 public class Student { public Student() { Lecture = new Li

我已经开始将我的“优步”环境分解成更小的专注环境。在一个简单的场景中,我有
学生
讲座
POCO,我的
EntityTypeConfiguration
在一个名为
学生和讲座
的新表中定义了两者之间的多对多关系

这些表是在我的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; }
}
在进一步的测试和实验之后,我发现如果我在模型中包含一个特定的(非其他)附加的
DbSet
,以及它的相关
ModelBuilder
配置,那么所有配置都可以正常工作。
DbSet
用于一个实体,
Registration
,它具有指向
Student
的导航属性,并带有
HasRequired(x=>x.Student)
。另一个扭曲是,如果我为
注册
实体保留
ModelBuilder
配置,但从我的重点上下文中删除
DbSet
,那么我的
讲座
导航属性将停止再次添加。(集合有0个元素)


我的困惑是,将
DbSet
添加到我的关注上下文中如何影响我的导航属性对上述表/实体的解析方式?我怎样才能解决这个问题。任何帮助都将不胜感激。

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


有很多(x=>x.学生),有很多(x=>x.讲座)

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

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

但是很容易让
MapLeftKey
MapRightKey
出错。我试图通过想象把它们分开:

讲座有很多学生
左:讲师ID右:学生ID
MSDN说明没有太大帮助,例如:

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

HasMany调用中指定的导航属性是
Students
,属性的父(或所有者)是
Teacher
,由
TeacherId
标识。。。我喜欢视觉化

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);
    }
}
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.
}