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
이제 등록 엔터티의 상태가 추가됨으로 설정되고 학생 엔터티의 상태가 삭제되었음을 볼 수 있습니다. 새 등록이 추가되고 한 명의 학생이 데이터베이스에서 제거 되었기 때문입니다.
더 나은 이해를 위해 위의 예를 단계별로 실행하는 것이 좋습니다.