【问题标题】:Entity Framework mapping between multiple tables多个表之间的实体框架映射
【发布时间】:2013-11-26 16:58:53
【问题描述】:

我正在尝试获得 4 个表之间的正确映射。

主表

类(ID,类名)

课程(ID,课程名称)

学生(ID,学生姓名)

关系表

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")

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

提前致谢。

【问题讨论】:

  • 看起来差不多,到底是什么问题?
  • @JeroenVannevel 在最后一个映射中。它期望左键是 CourseId,右键是 StudentId。但是由于 ClassCourseId 是 ClassCourse 表的主键,它与 CourseId 不匹配,因此不返回任何记录。 :-(

标签: c# entity-framework mapping


【解决方案1】:

我认为你必须重新审视你的设计。现在您正在尝试将复合键分配为外键,但这是无法完成的。

我要做的是创建一个单独的模型,它只存储课程-班级组合并提供一个参考键。这将导致一个额外的表,但允许你做你想做的事。

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

【讨论】:

  • 谢谢 Jeroen,我想改变设计以使其正常工作也是如此。再次感谢复合键作为外键不起作用的建议。 :-)
猜你喜欢
  • 2015-08-17
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
相关资源
最近更新 更多