2017-02-13 9 views
-1

Это метод обновления. Fromt eh, пользователь может изменять данные для существующего ученика, учителя или субъекта.EF6 Проверка каждого объекта для изменений перед сохранением

Я возвращаю модель представления в контроллер, который состоит из этих 3-х различных объектов:

- ViewModel -

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(); 
     } 

Иногда один или несколько предметов, не изменяется, поэтому, когда код получает на этот шаг он бросает «обновление магазина, вставку или удаление сек tatement повлияло на непредвиденное количество строк (0) ".

Как проверить каждый объект для изменений перед выполнением сохранения, поэтому я могу пропустить объект, если нет изменений?

+0

Исключение, которое вы получаете, не выбрасывается, когда объект не изменяется, но когда объект является новым и должен быть добавлен. –

+0

Я думаю, вам нужно добавить их в DbSet, а не вручную вступать в состояние изменения, но я не очень много знаю о вашем приложении. – Casey

+0

Casey - Что значит «добавить их в 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(); 
    } 

Объекты будут обновлены только в том случае, если какое-либо имущество было изменено.