我正在尝试使用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应仅进入学生和学生课程表。
但在我的方案中,课程表正在获取所选课程的新条目。所以我最终在课程表中重复了一遍。
如何告诉实体框架不要在课程表中输入,因为它已经拥有所有可能的课程...请帮助!
答案 0 :(得分:0)
问题是我在表示层中填充了我的对象,因此工作单元下的dbcontext不知道嵌套对象。这就是为什么它总是会尝试重新创建课程,即使它已经存在。要解决此问题,请在相同的工作单元dbcontext下填充Course对象。
前:
student.Course = UnitOfWork.Repository.FindById(id);
var model = UnitOfWork.Repository.Add(student);