Entity Framework Core Tutorial ChangeTracker
소개
ChangeTracker
클래스는 컨텍스트가 추적하는 엔티티 인스턴스에 대한 변경 추적 정보 및 작업에 대한 액세스를 제공합니다. EF 코어에서 DbContext에는 ChangeTracker 클래스가 포함되어 있으며 DbContext를 사용하여 검색되는 즉시 모든 엔터티 추적을 시작합니다.
변경 추적기는 다음 상태 중 하나를 사용하여 엔티티를 추적합니다.
- 추가됨
- 변하지 않은
- 수정 됨
- 삭제됨
- 분리 된
추가됨
엔티티가 컨텍스트에 의해 추적되고 있지만 데이터베이스에는 아직 존재하지 않습니다. 새로운 엔티티가 Add()
메소드를 사용하여 컨텍스트에 Add()
되면 추가 된 것으로 표시됩니다.
using (var context = new MyContext()) { var customer = new Customer { FirstName = "Thomas", LastName = "Hardy", Address = "120 Hanover Sq." }; context.Customers.Add(customer); foreach (var entry in context.ChangeTracker.Entries()) { Console.WriteLine("Entity: {0}, State: {1} ", entry.Entity.GetType().Name, entry.State.ToString()); } }
삭제됨
엔티티가 컨텍스트에 의해 추적되고 데이터베이스에 존재합니다. Remove()
메서드를 사용하여 DbContext에서 엔터티가 제거되면 Deleted로 표시됩니다.
using (var context = new MyContext()) { var customer = context.Customers .Where(c => c.FirstName == "Thomas") .FirstOrDefault(); context.Customers.Remove(customer); foreach (var entry in context.ChangeTracker.Entries()) { Console.WriteLine("Entity: {0}, State: {1} ", entry.Entity.GetType().Name, entry.State.ToString()); } }
분리 된
존재하는 DbContext 인스턴스의 범위를 벗어나 생성되거나 검색된 엔티티는 분리 된 것으로 표시됩니다.
var customer = new Customer { FirstName = "Elizabeth", LastName = "Lincoln", Address = "23 Tsawassen Blvd." }; using (var context = new MyContext()) { Console.Write(context.Entry(customer).State); }
존재하지 않는 엔티티는 기존의 DbContext 인스턴스에 의해 추적되지 않습니다.
수정 됨
엔티티가 컨텍스트에 의해 추적되고 데이터베이스에 존재합니다. 엔티티의 속성 값이 DbContext의 범위에서 변경되면 엔티티는 Modified로 표시됩니다.
using (var context = new MyContext()) { var customer = context.Customers .Where(c => c.FirstName == "Thomas") .FirstOrDefault(); customer.LastName = "Anders"; Console.Write(context.Entry(customer).State); }
변하지 않은
엔티티가 컨텍스트에 의해 추적되고 데이터베이스에 존재합니다. 엔티티가 원시 SQL 쿼리 또는 LINQ-to-Entities 쿼리를 사용하여 검색되면 Unchanged 상태가됩니다.
using (var context = new MyContext()) { var customer = context.Customers .Where(c => c.FirstName == "Mark") .FirstOrDefault(); Console.Write(context.Entry(customer).State); }