我正在尝试在4个表之间获得正确的映射。
MainTables
Class(Id,ClassName)
课程(Id,CourseName)
学生(同学,学生姓名)
关系表
ClassCourse(Id,ClassId,CourseId)
ClassCourseStudent(ClassCourseId,StudentId)
课程类有多对多的映射。所以我们使用关系表ClassCourse来存储关系
学生与ClassCourse有一对多的映射。
所以我的问题是如何为Student和ClassCourse进行映射
我的代码是
public class Class
(
public int Id {get;set;}
public string ClassName {get;set;}
public virtual ICollection<Course> Courses {get;set;}
)
public class Course
(
public int Id {get;set;}
public string CourseName {get;set;}
public virtual ICollection<Student> Students {get;set;}
)
public class Student
(
public int Id {get;set;}
public string StudentName {get;set;}
)
modelBuilder.Entity<Class>().ToTable("Class");
modelBuilder.Entity<Course>().ToTable("Course");
modelBuilder.Entity<Student>().ToTable("Student");
modelBuilder.Entity<Class>().HasMany(c => c.Courses).WithMany().Map(m => m.ToTable("ClassCourse")
m.MapLeftKey("ClassId")
m.MapRightKey("CourseId")
)
modelBuilder.Entity<Course>().HasMany(c => c.Students).WithMany().Map(m =>
m.ToTable("ClassCourseStudent")
m.MapLeftKey("ClassCourseId")
m.MapRightKey("StudentId")
最后一个映射是我要找的那个。
提前致谢。
答案 0 :(得分:2)
我认为你必须重新审视你的设计。现在,您正在尝试将复合键指定为外键,这是无法完成的。
我要做的是创建一个单独的模型,它只存储课程类组合并提供一个引用的键。这将产生一个额外的表,但允许你做你想要的。
class Student {
public int StudentId {get; set;}
}
class Class {
public int ClassId {get; set;}
}
class Course {
public int CourseId {get; set;}
}
class ClassCourse {
public int ClassCourseId {get; set;}
public int ClassId {get; set;}
public int CourseId {get; set;}
}
现在每个类都应该有ClassCourse
个对象列表而不是Course
,每个Course
应该有一个ClassCourse
个对象列表。现在它们没有直接链接在一起,但仍然通过中间对象连接,您可以将Student
个对象连接到ClassCourse
的主键。