Entity Framework предоставляет возможность отслеживать изменения, внесенные в объекты и их отношения, поэтому правильные обновления выполняются в базе данных при вызове метода контекста SaveChanges. Это ключевая особенность Entity Framework.
-
Отслеживание изменений отслеживает изменения при добавлении новых записей в коллекцию сущностей, изменении или удалении существующих сущностей.
-
Затем все изменения сохраняются на уровне DbContext.
-
Эти изменения дорожки теряются, если они не сохранены до уничтожения объекта DbContext.
-
Класс DbChangeTracker предоставляет вам всю информацию о текущих сущностях, отслеживаемых контекстом.
-
Чтобы отслеживать любую сущность по контексту, она должна иметь свойство первичного ключа.
Отслеживание изменений отслеживает изменения при добавлении новых записей в коллекцию сущностей, изменении или удалении существующих сущностей.
Затем все изменения сохраняются на уровне DbContext.
Эти изменения дорожки теряются, если они не сохранены до уничтожения объекта DbContext.
Класс DbChangeTracker предоставляет вам всю информацию о текущих сущностях, отслеживаемых контекстом.
Чтобы отслеживать любую сущность по контексту, она должна иметь свойство первичного ключа.
В Entity Framework отслеживание изменений включено по умолчанию. Вы также можете отключить отслеживание изменений, установив для свойства AutoDetectChangesEnabled объекта DbContext значение false. Если для этого свойства установлено значение true, то Entity Framework поддерживает состояние объектов.
using (var context = new UniContextEntities()) { context.Configuration.AutoDetectChangesEnabled = true; }
Давайте рассмотрим следующий пример, в котором студенты и их зачисления извлекаются из базы данных.
class Program { static void Main(string[] args) { using (var context = new UniContextEntities()) { context.Configuration.AutoDetectChangesEnabled = true; Console.WriteLine("Retrieve Student"); var student = (from s in context.Students where s.FirstMidName == "Ali" select s).FirstOrDefault<Student>(); string name = student.FirstMidName + " " + student.LastName; Console.WriteLine("ID: {0}, Name: {1}", student.ID, name); Console.WriteLine(); Console.WriteLine("Retrieve all related enrollments"); foreach (var enrollment in student.Enrollments) { Console.WriteLine("Enrollment ID: {0}, Course ID: {1}", enrollment.EnrollmentID, enrollment.CourseID); } Console.WriteLine(); Console.WriteLine("Context tracking changes of {0} entity.", context.ChangeTracker.Entries().Count()); var entries = context.ChangeTracker.Entries(); foreach (var entry in entries) { Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().Name); Console.WriteLine("Status: {0}", entry.State); } Console.ReadKey(); } } }
Когда приведенный выше пример скомпилирован и выполнен, вы получите следующий вывод.
Retrieve Student ID: 1, Name: Ali Alexander Retrieve all related enrollments Enrollment ID: 1, Course ID: 1050 Enrollment ID: 2, Course ID: 4022 Enrollment ID: 3, Course ID: 4041 Context tracking changes of 4 entity. Entity Name: Student Status: Unchanged Entity Name: Enrollment Status: Unchanged Entity Name: Enrollment Status: Unchanged Entity Name: Enrollment Status: Unchanged
Вы можете видеть, что все данные извлекаются только из базы данных, поэтому статус остается неизменным для всех объектов.
Давайте теперь рассмотрим еще один простой пример, в котором мы добавим еще одну запись и удалим одного студента из базы данных. Ниже приведен код, в котором добавляется новая запись и один студент удаляется.
class Program { static void Main(string[] args) { using (var context = new UniContextEntities()) { context.Configuration.AutoDetectChangesEnabled = true; Enrollment enr = new Enrollment() { StudentID = 1, CourseID = 3141 }; Console.WriteLine("Adding New Enrollment"); context.Enrollments.Add(enr); Console.WriteLine("Delete Student"); var student = (from s in context.Students where s.ID == 23 select s).SingleOrDefault<Student>(); context.Students.Remove(student); Console.WriteLine(""); Console.WriteLine("Context tracking changes of {0} entity.", context.ChangeTracker.Entries().Count()); var entries = context.ChangeTracker.Entries(); foreach (var entry in entries) { Console.WriteLine("Entity Name: {0}", entry.Entity.GetType().Name); Console.WriteLine("Status: {0}", entry.State); } Console.ReadKey(); } } }
Когда приведенный выше пример скомпилирован и выполнен, вы получите следующий вывод.
Adding New Enrollment Delete Student Context tracking changes of 2 entity. Entity Name: Enrollment Status: Added Entity Name: Student Status: Deleted
Теперь вы можете видеть, что статус объекта регистрации установлен как добавленный, а статус объекта студента удален, поскольку добавлена новая запись и один студент удален из базы данных.
Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.