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