与查找表实体框架的多对多关系

时间:2017-07-12 01:30:36

标签: c# asp.net-mvc entity-framework entity-framework-6

我正在尝试使用Lookup表创建多对多的关系。假设我有一张桌子"课程"有3种可能的课程:

Course
Id | Name
1  | History
2  | Maths
3  | Science

我有另一张桌子我将在哪里创建学生,如:

Student
Id | Name

我有一个映射表,即StudentCourse:

StudentCourse
ID | StudentId | CourseId
1  |   1       | 3

这是我的学生&课程类:

public class Student : Entity<Student,int>
{
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course : Entity<Course,int>
{
    public virtual ICollection<Student> Student { get; set; }
}

最后,这是配置代码:

   modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(cs =>
                        {
                            cs.MapLeftKey("StudentId");
                            cs.MapRightKey("CourseId");
                            cs.ToTable("StudentCourse");
                        });

当我从视图创建学生实体时,用户从课程表中选择课程并将其发送到实体框架,EF应仅进入学生和学生课程表。

但在我的方案中,课程表正在获取所选课程的新条目。所以我最终在课程表中重复了一遍。

如何告诉实体框架不要在课程表中输入,因为它已经拥有所有可能的课程...请帮助!

1 个答案:

答案 0 :(得分:0)

问题是我在表示层中填充了我的对象,因此工作单元下的dbcontext不知道嵌套对象。这就是为什么它总是会尝试重新创建课程,即使它已经存在。要解决此问题,请在相同的工作单元dbcontext下填充Course对象。

前:

  student.Course = UnitOfWork.Repository.FindById(id);
  var model = UnitOfWork.Repository.Add(student);