首页 文章

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

提问于
浏览
1

我试图在4个表之间获得正确的映射 .

MainTables

类(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 回答

  • 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 的主键 .

相关问题