多个表之间的实体框架映射

时间:2013-11-13 21:34:20

标签: c# entity-framework mapping

我正在尝试在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")

最后一个映射是我要找的那个。

提前致谢。

1 个答案:

答案 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的主键。