.NET MVC 4 ApplicationDbContext.SaveChanges()未正确保存所有数据



我有一个简单的MVC应用程序,它允许在Student Course数据库上进行CRUD操作。我有一个学生模型和一个课程模型,其中Course.EnrolledStudents是一个列表。现在,我已经完成了在课程中添加和删除学生的所有工作,但有一件事我遇到了麻烦。

如果我有一个学生,"Joe Smith",并将他添加到CS 101类,那么我尝试将他也添加到CS 102,两门课程都会在注册学生列表中显示Joe Smith,直到调用Db.SaveChanges()。一旦被调用,则CS 101中Joe Smith的先前条目被删除,并且导致Joe Smith仅是CS 102课程的一部分。

我的猜测是,这与数据库键值有关。在这两种情况下,Joe Smith Student对象都有一个密钥ID=3,这让我认为,当创建第二个条目时,它会发现已经有一个ID=3的记录,并删除旧的记录。这听起来正确吗?如果是,我该怎么办才能阻止它。这是相关代码:

排班控制器

[HttpGet]
public ActionResult Add(int courseId, int studentId)
{
Student newstudent = Db.Students.Find(studentId);
//List<Course> courses = Db.Courses.ToList();
Course course = Db.Courses.Find(courseId);
course.EnrolledStudents.Add(newstudent);
Db.SaveChanges();
return RedirectToAction("Index", new { id = courseId });
}
public ActionResult Remove(int courseId, int studentId)
{
Course c = Db.Courses.Find(courseId);
Student s = Db.Students.Find(studentId);
c.EnrolledStudents.Remove(s);
Db.SaveChanges();
return RedirectToAction("Index", new { id = courseId});
}

课程模型

public class Course
{
public Course()
{
this.EnrolledStudents = new List<Student>();
CourseName = "Unknown";
}
[Key]
public int Id { get; set; }
public string CourseName { get; set; }
public virtual List<Student> EnrolledStudents {get; set;}
}

学生模型

public class Student
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int StudentId { get; set; }
}

"按照惯例,Code First总是将单向关系解释为一对多。"在您的情况下,您通过EnrolledStudentsCourseStudents具有单向关系。由于按照惯例,关系是一对多("一"是Course,"多"是Student),每个Student只有一个过程。这可能在数据库中由Student表"CourseId"中的一列表示。也就是说,只有一个地方可以为学生存储课程,所以设置两次会覆盖它。

如果要建立多对多关系,可以将集合关系从Student添加到Course,也可以使用Entity Framework Fluent API覆盖EF的约定。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Student>()
.HasMany(t => t.EnrolledCourses)
.WithMany(t => t.EnrolledStudents);
}

相关内容

最新更新