ID 확인, 상태 관리 및 변경 내용 추적(Entity Framework)

ObjectContext는 메모리 내 개체의 컨테이너를 나타냅니다. 개체 컨텍스트는 다른 클래스와 인터페이스를 사용하여 개체의 ID, 상태, 개체 속성의 원래 값 및 현재 값을 관리하고, 캐시의 각 개체에 대한 변경 내용을 추적합니다. 개체 컨텍스트에 개체를 연결하는 방법은 개체 연결 및 분리(Entity Framework)를 참조하십시오. 이 항목에서는 개체 컨텍스트에서 변경 내용 추적, ID 확인 및 상태 관리를 관리하는 방법을 설명합니다.

변경 내용 추적

개체 그래프의 변경 내용 추적 정보는 연결된 각 개체에 대해 ObjectContext를 통해 만들어지는 ObjectStateEntry 개체에 저장됩니다. ObjectStateEntry 개체는 엔터티에 대한 다음 정보를 저장합니다.

  • 엔터티의 ID를 확인하는 EntityKey

  • 개체에 대한 EntityState

  • 관련 개체에 대한 정보

  • 엔터티 집합 이름

  • 엔터티 속성의 CurrentValuesOriginalValues(Added 상태의 개체에는 원래 값이 없음)

  • 엔터티의 수정된 속성 이름

SaveChanges 호출 사이에 속성 값이 변경되었는지 확인하려면 GetModifiedProperties 메서드에서 반환하는 변경된 속성 이름의 컬렉션을 쿼리합니다.

Bb896269.note(ko-kr,VS.100).gif참고:
변경 내용 추적 프록시가 없는 POCO 엔터티로 작업하는 경우 GetModifiedProperties를 호출하기 전에 DetectChanges를 호출해야 합니다.

엔터티가 분리되면 해당 ObjectStateEntry 개체가 개체 컨텍스트에서 제거됩니다.

ObjectStateEntry 개체는 ObjectStateManager에서 관리합니다. ObjectStateManager 인스턴스는 개체 컨텍스트마다 하나씩 있습니다. 지정된 엔터티에 대한 ObjectStateEntry 개체를 가져오려면 ObjectStateManagerTryGetObjectStateEntry, GetObjectStateEntry 또는 GetObjectStateEntries 메서드 중 하나를 사용합니다.

개체 컨텍스트는 POCO 변경 내용 추적 프록시 개체 및 Entity Framework 에서 생성된 엔터티의 속성이 변경될 때 해당 변경 내용에 대한 알림을 받고 ObjectStateEntry에서 개체 상태와 속성 값을 업데이트합니다. 변경 보고 모델에서는 IEntityChangeTracker 인터페이스를 사용하여 보류 중인 속성 변경을 보고하고 속성을 설정한 다음 변경이 완료되었음을 보고합니다. ObjectStateEntry는 변경 내용 추적 프록시 개체가 없는 POCO 엔터티와 복합 형식 개체를 서로 다른 방식으로 관리합니다. 자세한 내용은 POCO 엔터티에서 변경 내용 추적(Entity Framework)을 참조하십시오.

개체 컨텍스트에서는 ObjectStateEntry 개체의 정보를 사용하여 데이터를 데이터 소스에 유지합니다. 자세한 내용은 변경 내용 저장 및 동시성 관리(Entity Framework)방법: 변경된 내용을 저장할 때 비즈니스 논리 실행(Entity Framework)을 참조하십시오.

ID 확인 및 병합 옵션

Entity Framework 는 캐시에서 특정 엔터티 키가 있는 개체의 단일 인스턴스만 유지 관리합니다. EntityKey 개체는 개체의 ID를 나타내는 변경할 수 없는 개체입니다. 엔터티 키는 개체 컨텍스트에서 ID 확인을 수행하는 데 사용됩니다. 자세한 내용은 엔터티 키 사용(Entity Framework)을 참조하십시오. ID가 동일한 엔터티를 이미 추적하고 있으면 데이터 소스에서 가져온 데이터와 상태 관리자에 이미 있는 데이터가 쿼리의 MergeOption에 따라 병합됩니다.

다음 표에서는 가능한 병합 옵션을 보여 줍니다.

멤버 설명

AppendOnly

개체 컨텍스트에 없는 개체가 해당 컨텍스트에 연결됩니다. 개체가 컨텍스트에 이미 있으면 항목에 있는 개체 속성의 현재 값과 원래 값이 데이터 소스 값으로 덮어쓰여지지 않습니다. 개체의 항목 상태와 항목에 있는 개체의 속성 상태는 변경되지 않습니다. AppendOnly가 기본 병합 옵션입니다.

OverwriteChanges

개체 컨텍스트에 없는 개체가 해당 컨텍스트에 연결됩니다. 개체가 컨텍스트에 이미 있으면 항목에 있는 개체 속성의 현재 값과 원래 값이 데이터 소스 값으로 덮어쓰여집니다. 개체의 항목 상태가 Unchanged로 설정되고 속성이 수정된 것으로 표시되지 않습니다.

PreserveChanges

개체 컨텍스트에 없는 개체가 해당 컨텍스트에 연결됩니다.

엔터티 상태가 Unchanged이면 항목의 현재 값과 원래 값이 데이터 소스 값으로 덮어쓰여집니다. 엔터티 상태가 Unchanged로 유지되고 속성이 수정된 것으로 표시되지 않습니다.

엔터티 상태가 Modified이면 수정된 속성의 현재 값이 데이터 소스 값으로 덮어쓰여지지 않습니다. 수정되지 않은 속성의 원래 값은 데이터 소스의 값으로 덮어쓰여집니다.

.NET Framework 버전 4에서 Entity Framework 는 수정되지 않은 속성의 현재 값을 데이터 소스에서 반환된 값과 비교합니다. 값이 동일하지 않으면 속성이 수정된 것으로 표시됩니다.

.NET Framework 버전 3.5 SP1에서 Entity Framework 는 데이터 소스의 값이 다른 경우에도 속성을 수정된 것으로 표시하지 않습니다.

SaveChanges를 호출하면 수정된 속성만 데이터 소스에 유지됩니다.

3.5 SP1 동작을 유지하려면 UseLegacyPreserveChangesBehaviortrue로 설정합니다. PreserveChanges 옵션을 사용하여 로컬 컨텍스트에서 변경 내용을 유지하는 동안 낙관적 동시성 예외를 확인할 수 있습니다. 자세한 내용은 변경 내용 저장 및 동시성 관리(Entity Framework)를 참조하십시오.

NoTracking

개체가 Detached 상태로 유지 관리되며 ObjectStateManager에서 추적되지 않습니다. 그러나 Entity Framework 에서 생성된 엔터티와 프록시가 있는 POCO 엔터티는 관련 개체의 로드를 쉽게 하기 위해 개체 컨텍스트에 대한 참조를 유지합니다.

엔터티 상태

개체 컨텍스트에서는 개체의 상태에 대해 알고 있어야만 변경 내용을 데이터 소스에 다시 저장할 수 있습니다. ObjectStateEntry 개체는 EntityState 정보를 저장합니다. ObjectContextSaveChanges 메서드는 컨텍스트에 연결된 엔터티를 처리하고 각 개체의 EntityState에 따라 데이터 소스를 업데이트합니다. 자세한 내용은 개체 만들기, 추가, 수정 및 삭제(Entity Framework)를 참조하십시오. 다음 표에서는 개체의 가능한 상태를 보여 줍니다.

멤버 설명

Added

개체 컨텍스트에 새 개체가 추가되었으며 SaveChanges 메서드가 호출되지 않았습니다. 변경 내용이 저장된 후에는 개체 상태가 Unchanged로 변경됩니다. Added 상태의 개체는 ObjectStateEntry에 원래 값이 없습니다.

Deleted

개체 컨텍스트에서 개체가 삭제되었습니다. 변경 내용이 저장된 후에는 개체 상태가 Detached로 변경됩니다.

Detached

개체가 존재하지만 추적되고 있지 않습니다. 엔터티는 만들어진 직후 개체 컨텍스트에 추가되기 전에 이 상태가 됩니다. NoTracking MergeOption을 사용하여 로드된 경우 또는 Detach 메서드를 호출하여 컨텍스트에서 제거된 후에도 엔터티가 이 상태입니다. Detached 상태의 개체와 연결된 ObjectStateEntry 인스턴스가 없습니다.

Modified

개체의 스칼라 속성 중 하나가 수정되었으며 SaveChanges 메서드가 호출되지 않았습니다. 변경 내용 추적 프록시가 없는 POCO 엔터티에서는 DetectChanges 메서드가 호출되면 수정된 속성의 상태가 Modified로 변경됩니다. 변경 내용이 저장된 후에는 개체 상태가 Unchanged로 변경됩니다.

Unchanged

컨텍스트에 연결되거나 SaveChanges 메서드가 마지막으로 호출된 이후 개체가 수정되지 않았습니다.

개체 컨텍스트의 개체 상태는 ObjectStateManager에서 관리됩니다. 개체 상태를 확인하려면 ObjectStateManagerTryGetObjectStateEntry, GetObjectStateEntry 또는 GetObjectStateEntries 메서드 중 하나를 호출합니다. ObjectStateEntryState 속성은 개체의 상태를 정의합니다.

참고 항목

개념

엔터티 키 사용(Entity Framework)