在EF中更新具有多对多导航属性的实体

时间:2014-01-07 14:24:50

标签: c# foreign-keys entity-framework-5

我有一个关于EF和多对多关系的问题

我有一个包含以下表格的数据库:学生,课程,学生课程(关联表)。 因此,由于关联表,我得到了多对多的关系。

这意味着我可以从学生实体导航到与他绑定的所有课程列表。

想象一下,我有以下课程= 1编程,2英语,3分析。

现在我得到一个新学生,我想将他添加到数据库中,有两门课程,我这样做:

using(DBContext context = new DBContext())
{
    student s = new student();
    s.Name="John Doe";
    s.Courses = new List<course>(){new course() {Id=2, Name="English"}, new course() {Id=3, Name="Analyse"}};
    context.students.Add(s);
    context.SaveChanges();
}

这将正确添加新学生以及与关联表的关系! 在我的关联表中,我将有以下内容: 1 2 1 3

这是结合PK。

现在这个学生突然决定而不是那两个课程和另一个课程,然后我必须更新它,但在这里我有一个错误! 我有以下内容:

using(DBContext context = new DBContext())
{
    student s = context.students.Find(1);
    s.Courses = new List<Courses>().Add(new course(){Id=1, Name="Programming"});
    context.SaveChanges();
}

在这种情况下,我会收到一条错误,说主键已经存在,基本上它会尝试在关联表中再次添加所有这些课程。

在我的例子中,更简单的是你可以说你只需要添加1个课程,然后添加一个就是它,但我不再看到那里的关系了,因为其他2个不会被删除虽然他们应该!如果我在该上下文中更改名称并保存更改,则名称会更新,但不会尝试添加该学生的其他实例。

想象一下,如果有一个带有课程的表格,学生去那里只修改他的名字,他重新提交表格,所以基本上以前选择的课程将被发回服务器,应用程序将尝试处理它们,通常好吧,它可以在关联表中再次编辑它们,或者如果它比较并且如果课程相同则忽略...但在我的情况下它只是尝试再次添加它们。

我希望我能解释清楚,我的问题,只是总结一下我的问题是:如何正确更新多对多引用的属性?

1 个答案:

答案 0 :(得分:0)

您应该只将课程添加到课程集合中,不要替换该集合。像这样:

using(DBContext context = new DBContext())
{
    student s = context.students.Find(1);
    s.Courses.Add(new course(){Id=1, Name="Programming"});
    context.SaveChanges();
}

using(DBContext context = new DBContext()) { student s = context.students.Find(1); s.Courses.Add(new course(){Id=1, Name="Programming"}); context.SaveChanges(); }