Entity Framework-변경 내용 추적

Entity Framework는 엔터티 및 해당 관계에 대한 변경 사항을 추적하는 기능을 제공하므로 컨텍스트의 SaveChanges 메서드가 호출 될 때 데이터베이스에서 올바른 업데이트가 수행됩니다. 이것은 Entity Framework의 핵심 기능입니다.

  • 변경 내용 추적은 엔터티 컬렉션에 새 레코드를 추가하거나 기존 엔터티를 수정 또는 제거하는 동안 변경 사항을 추적합니다.

  • 그런 다음 모든 변경 사항은 DbContext 수준에서 유지됩니다.

  • 이러한 트랙 변경 사항은 DbContext 개체가 삭제되기 전에 저장되지 않으면 손실됩니다.

  • DbChangeTracker 클래스는 컨텍스트에 의해 추적되는 현재 엔터티에 대한 모든 정보를 제공합니다.

  • 컨텍스트로 엔터티를 추적하려면 기본 키 속성이 있어야합니다.

Entity Framework에서 변경 내용 추적은 기본적으로 사용됩니다. DbContext의 AutoDetectChangesEnabled 속성을 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

이제 등록 엔터티의 상태가 추가됨으로 설정되고 학생 엔터티의 상태가 삭제되었음을 볼 수 있습니다. 새 등록이 추가되고 한 명의 학생이 데이터베이스에서 제거 되었기 때문입니다.

더 나은 이해를 위해 위의 예를 단계별로 실행하는 것이 좋습니다.