如果我有一个Course
课程,其中有一组学生(ICollection<Person>
),如下所示:
public class Person
{
public Person()
{
this.Courses = new HashSet<Course>();
}
public int PersonId { get; set; }
[Required]
public string PersonName { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
public Course()
{
this.Students = new HashSet<Person>();
}
public int CourseId { get; set; }
public string CourseName { get; set; }
public virtual ICollection<Person> Students { get; set; }
}
我最终在数据库中使用了这个结构(如预期的那样):
(请注意PersonCourses
表)
但是,在我的例子中,我还想在课程中添加一名讲师。
这位教师也是Person
,,可以像其他人一样参加课程,所以我调整了上面的课程,如下所示:
public class Person
{
public Person()
{
this.Courses = new HashSet<Course>();
}
public int PersonId { get; set; }
[Required]
public string PersonName { get; set; }
public virtual ICollection<Course> Courses { get; set; }
public virtual ICollection<Course> InstructedCourses { get; set; }
}
public class Course
{
public Course()
{
this.Students = new HashSet<Person>();
}
public int CourseId { get; set; }
public string CourseName { get; set; }
public virtual ICollection<Person> Students { get; set; }
public virtual Person Instructor { get; set; }
}
我期望看到的是与上面相同的数据库结构,但创建了一个将人与多个课程相关联的附加表。
然而,我得到的是:
(请注意,PersonCourses
表格已经消失了)
可能值得说明的是,我没有单独的Instructor/Person
课程的原因是我期望任何Person
可以创建一门课程,从而成为该课程的讲师。
首先 - 这可以通过EF中的代码优先实现吗?我这么假装。
其次 - 我做错了什么?
第三 - 这是周末了吗?
所有帮助表示赞赏:)
答案 0 :(得分:0)
这是我不喜欢/推荐代码优先的一个原因。看起来EF与第二个InstructedCourses集合混淆了,而只是从课程中设置了教师参考,虽然它似乎刚刚使学生集合成为1对多。
我会认真考虑: A)更改您的域以定义教师实体与学生实体 要么 B)首先使用适当的EF映射到所需的表格来构建模式。
我认为任何DBA都不希望在整个架构中看到类似course_personId / Person_personId的内容,而这些内容有一天需要支持和优化。
教师和学生可以扩展基地&#34; Person&#34;具有每个实体的表或标识符的类。然后可以更清楚地定义教师和课程与学生关系的课程。如果你想要同一个人,那么限制就是&#34;能够被引用为教师和学生。