通常,页面将具有单个主要实体并具有子实体。我之前有过这种分离的多对多
的解决方案e.g。
db.Entry(Class).State = EntityState.Modified;
foreach(var student in Class.student) {
var dbStudent = db.Students.Find(student.StudentID);
dbStudent.Classes.Add(Class);
}
我的问题是我在视图中有多个Classes并且导致“相同类型的实体已经具有相同的主键值”
e.g。循环类列表
foreach(var class in viewModel.Classes) {
db.Entry(Class).State = EntityState.Modified;
}
如果两个班级中都有相同的学生,则上面的代码会在到达第二课时抛出错误。这是因为分配EntityState还会加载子实体并创建同一学生的2个实例。
我尝试通过创建临时集合来操纵它,以便它只有一个实例
e.g。
var students = new List<students>();
foreach(var class in viewModel.Classes) {
foreach(var student in class.Students) {
Student dbStudent = null;
if(!students.Any(s => s.StudentID == student.StudentID)) {
dbStudent = db.Student.Find(student.StudentID);
students.Add(dbStudent);
db.Entry(dbStudent).State = EntityState.Modified;
}
else {
dbStudent = students.Where(s => s.StudentID == student.StudentID).SingleOrDefault();
}
dbStudent.Classes.Add(class);
}
db.Entry(class).State = EntityState.Modified;
}
上面的代码适用于新条目,但对于现有条目,它会导致“主键错误”,对我来说,它是分离的。尝试删除现有条目时,这也无效。
有人可以帮我吗?感谢