EF6在保存前检查每个实体的更改
问题描述:
这是一种更新方法。从视图来看,用户可以改变现有学生,老师或主题的数据。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)“错误。
如何在保存之前检查每个实体的更改,以便在没有更改的情况下跳过实体?
答
如果要检查更改的实体,您需要查询他们,让下面的解决方案也许满足你:
如果查询实体,然后对其进行修改,然后变更跟踪器会自动为做到这一点你和你不必为此编写代码。因此,您可以使用以下代码:
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();
}
只有在任何属性已被修改的情况下,实体才会更新。
当实体没有被更改时,但是当实体是新的并且必须被添加时,不会抛出异常。 –
我认为你需要将它们添加到DbSet,而不是手动搞乱更改状态,但是我对你的应用程序并不了解。 – Casey
凯西 - 什么意思是“将它们添加到DbSet”? – BattlFrog