2017-02-13 53 views
-1

这是一种更新方法。从视图来看,用户可以改变现有学生,老师或主题的数据。EF6在保存前检查每个实体的更改

我返回一个视图模型到由这些3个不同的实体的控制器:

- 视图模型 -

public class StudentTeacherVM 
{ 
    public StudentModel Student { get; set; } 
    public TeacherModel Teacher { get; set; } 
    public SubjectModel Subject { get; set; } 
} 

在我在VM分割出的数据到控制器该数据库的实体,然后将其保存:

 using (var db = new SchoolEntities()) 
     { 
      Student student = new Student() 
      { 
       StudentId = model.StudentId, 
       FirstName = model.FirstName, 
       LastName = model.LastName, 
       EmailAddress = model.StudentEmailAddress, 
       TeacherId = model.TeacherId 
      }; 

      Teacher teacher = new Teacher() 
      { 
       TeacherId = model.TeacherId, 
       FirstName = model.FirstName, 
       LastName = model.LastName, 
       EmailAddress = model.TeacherEmailAddress 
       SubjectId = model.SubjectId 
      }; 

      Subject subject = new Subject() 
      { 
       SubjectId = model.SubjectId, 
       Description = model.SubjectDescription, 
       Level = model.SubjectLevel 
      }; 

      db.Entry(subject).State = EntityState.Modified; 
      db.Entry(teacher).State = EntityState.Modified; 
      db.Entry(student).State = EntityState.Modified; 
      db.SaveChanges(); 
     } 

有时一个或多个科目不被修改,所以当代码获取到这一步,它抛出了“商店更新,插入或删除小号声明影响了意外的行数(0)“错误。

如何在保存之前检查每个实体的更改,以便在没有更改的情况下跳过实体?

+0

当实体没有被更改时,但是当实体是新的并且必须被添加时,不会抛出异常。 –

+0

我认为你需要将它们添加到DbSet,而不是手动搞乱更改状态,但是我对你的应用程序并不了解。 – Casey

+0

凯西 - 什么意思是“将它们添加到DbSet”? – BattlFrog

回答

1

如果要检查更改的实体,您需要查询他们,让下面的解决方案也许满足你:

如果查询实体,然后对其进行修改,然后变更跟踪器会自动为做到这一点你和你不必为此编写代码。因此,您可以使用以下代码:

using (var db = new SchoolEntities()) 
    { 
     Student student = db.students.Single(x => x.StudentId == model.StudentId); 
     student.FirstName = model.FirstName; 
     student.LastName = model.LastName; 
     student.EmailAddress = model.StudentEmailAddress; 
     student.TeacherId = model.TeacherId; 

     Teacher teacher = db.teachers.Single(x => x.TeacherId == model.TeacherId); 
     teacher.FirstName = model.FirstName; 
     teacher.LastName = model.LastName; 
     teacher.EmailAddress = model.TeacherEmailAddress; 
     teacher.SubjectId = model.SubjectId; 

     Subject subject = db.subjects.Single(x => x.SubjectId == model.SubjectId); 
     subject.Description = model.SubjectDescription; 
     subject.Level = model.SubjectLevel; 

     db.SaveChanges(); 
    } 

只有在任何属性已被修改的情况下,实体才会更新。