다음을 통해 공유


개체 연결 및 분리(Entity Framework)

Entity Framework 에서는 개체를 개체 컨텍스트에 연결하거나 개체 컨텍스트에서 분리할 수 있습니다. 개체 컨텍스트에 연결된 개체는 해당 개체 컨텍스트에 의해 추적 및 관리됩니다. 분리된 개체는 개체 컨텍스트에서 참조하지 않으며, 해당 개체의 리소스는 .NET Framework에서 회수할 수 있습니다. 이 항목에서는 개체의 연결 및 분리 방법과 이러한 작업을 수행할 때 고려해야 할 사항에 대해 설명합니다.

개체 연결

쿼리가 Entity Framework 의 개체 컨텍스트 내에서 실행될 때 반환되는 개체는 자동으로 개체 컨텍스트에 연결됩니다. 쿼리가 아닌 다른 소스에서 가져온 개체 컨텍스트에 개체를 연결할 수도 있습니다. 또한 이전에 분리된 개체, NoTracking 쿼리에서 반환된 개체 또는 개체 컨텍스트 외부에서 가져온 개체를 연결하거나, ASP.NET 응용 프로그램의 뷰 상태에서 저장되었거나 원격 메서드 호출 또는 웹 서비스에서 반환된 개체를 연결할 수도 있습니다.

다음 메서드 중 하나를 사용하여 개체를 개체 컨텍스트에 연결합니다.

멤버 설명

System.Data.Objects.ObjectSet.AddObject(

또는

System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)

ObjectContext에 개체와 해당 관련 개체를 추가하고 엔터티 개체를 Added 상태로 설정합니다. 이 상태에서는 엔터티 개체에 고유한 키 값이 없어도 됩니다. 임시 키 값이 키 속성에 할당되며, 개체를 저장한 후 이 값은 데이터 소스에서 생성된 값으로 업데이트됩니다. 개체를 추가한 후에는 엔터티 개체의 상태를 적절하게 변경합니다.

System.Data.Objects.ObjectSet.Attach(

또는

System.Data.Objects.ObjectContext.Attach(System.Data.Objects.DataClasses.IEntityWithKey)

AttachTo

ObjectContext에 개체를 추가하고 이 개체를 Unchanged 상태로 설정합니다. Unchanged 상태에서는 Entity Framework 가 엔터티 키 값을 최종 값으로 처리합니다. 키 값이 동일한 특정 형식의 엔터티가 둘 이상이면 Entity Framework 에서는 예외를 throw합니다. 예외가 발생하지 않도록 하려면 AddObject 메서드를 사용하여 분리된 개체를 연결한 다음 상태를 적절하게 변경합니다.

개체는 Unchanged 상태에서 개체 컨텍스트에 연결됩니다. 개체가 분리된 상태에서 수정되어 개체 상태나 관계를 변경해야 하는 경우에는 다음 메서드 중 하나를 사용합니다.

멤버 설명

ChangeObjectState

엔터티 또는 관계를 Added 또는 Modified와 같은 새 상태로 변경합니다. 이 변경 내용은 엔터티가 참여하는 관계에 영향을 줍니다. 예를 들어 엔터티를 Added 상태로 이동하면 변경되지 않은 관계도 Added 상태로 이동됩니다. 마찬가지로 엔터티를 Modified로 표시하면 모든 스칼라 값이 Modified로 표시됩니다.

ObjectStateEntryChangeState 메서드를 사용할 수도 있습니다.

ChangeRelationshipState

두 엔터티 간의 기존 관계를 지정된 상태로 변경합니다. 엔터티 간에 관계가 없으면 이 메서드는 지정된 상태로 새 관계를 만듭니다. 외래 키 연결을 기반으로 하는 관계에는 이 메서드를 사용할 수 없습니다. 자세한 내용은 관계 정의 및 관리(Entity Framework)를 참조하십시오.

ObjectStateEntryChangeObjectState 메서드를 사용할 수도 있습니다.

ChangeState

이 메서드는 ObjectStateEntry가 개체인지 관계인지에 따라 ChangeObjectState 또는 ChangeRelationshipState와 동일하게 동작합니다.

SetModifiedProperty

개별 속성을 Modified 상태로 설정합니다. 속성이 수정된 경우 전체 엔터티를 수정된 상태로 설정하는 대신 이 메서드를 사용합니다.

연결되는 개체에 업데이트된 속성 값이 있는 경우 다음 메서드 중 하나를 사용합니다.

멤버 설명

System.Data.Objects.ObjectSet.ApplyCurrentValues(

또는

System.Data.Objects.ObjectContext.ApplyCurrentValues.String,

제공된 개체의 스칼라 값을 키가 동일한 ObjectContext의 개체에 복사합니다. 원래 값과 다른 값은 모두 수정된 상태로 표시됩니다.

현재 값이 있는 그래프가 있는 경우 원래 값을 적용하려면 ApplyOriginalValues 메서드를 호출합니다.

ObjectStateEntryApplyCurrentValues 메서드를 사용할 수도 있습니다.

System.Data.Objects.ObjectSet.ApplyOriginalValues(

또는

System.Data.Objects.ObjectContext.ApplyOriginalValues.String,

제공된 개체의 스칼라 값을 키가 동일한 ObjectContext의 개체에 대한 원래 값 집합에 복사합니다. 현재 값과 다른 값은 모두 수정된 상태로 표시됩니다.

ObjectStateEntryApplyOriginalValues 메서드를 사용할 수도 있습니다.

SetModifiedProperty

개별 속성을 Modified 상태로 설정합니다. 속성이 수정된 경우 전체 엔터티를 수정된 상태로 설정하는 대신 이 속성을 사용합니다.

GetUpdatableOriginalValues

ObjectStateEntry와 연결된 개체의 원래 값을 업데이트 가능한 버전으로 나타내는 OriginalValueRecord 인스턴스를 가져옵니다. 반환된 OriginalValueRecord 인스턴스는 개체의 원래 속성을 개별적으로 읽거나 업데이트하는 데 사용합니다.

CurrentValues

ObjectStateEntry와 연결된 개체의 현재 값을 나타내는 CurrentValueRecord 인스턴스를 가져옵니다. 반환된 CurrentValueRecord 인스턴스는 개체의 현재 속성을 개별적으로 읽거나 업데이트하는 데 사용합니다.

개체 연결 시 고려 사항

개체를 개체 컨텍스트에 연결할 때 다음 사항을 고려해야 합니다.

  • 연결되는 개체에 관련된 개체가 있는 경우 이러한 개체 또한 개체 컨텍스트에 연결됩니다.

  • 연결된 개체가 데이터 소스에 없는 경우 이 개체는 SaveChanges 동안 추가되지 않습니다. 이 경우 속성이 변경되면 SaveChanges 동안 서버에서 예외가 발생합니다. 개체를 추가하려면 System.Data.Objects.ObjectSet.AddObject( 또는 **System.Data.Objects.ObjectContext.AddObject(System.String,System.Object)**를 사용합니다.

    연결되는 개체가 다른 개체에 관련되는 경우 관계 정의 및 관리(Entity Framework)에 설명된 방법 중 하나로 관계를 명시적으로 정의해야 합니다. 자세한 내용은 방법: 관련 개체 연결(Entity Framework)을 참조하십시오.

  • Attach 메서드에 전달되는 개체에는 올바른 EntityKey 값이 있어야 합니다. 개체에 올바른 EntityKey 값이 없으면 AttachTo 메서드를 사용하여 엔터티 집합의 이름을 지정합니다.

  • 연결되는 개체가 개체 컨텍스트에 이미 있는 다른 개체와 동일한 EntityKey를 갖는 경우 InvalidOperationException이 발생합니다. 컨텍스트에 동일한 키를 갖는 개체가 Added 상태로 있는 경우에는 이 오류가 발생하지 않습니다.

개체 분리

Entity Framework 응용 프로그램에서는 개체 컨텍스트에서 개체를 분리할 수 있습니다. 동일한 개체 컨텍스트에서 반복되는 쿼리를 실행하면 개체 컨텍스트에 필요한 메모리가 많아지므로 개체를 분리하면 리소스를 절약할 수 있습니다. MergeOption 값이 NoTracking인 쿼리를 실행하여 개체가 개체 컨텍스트에 연결되지 않도록 하거나, 다음 예제에서처럼 System.Data.Objects.ObjectSet.Detach( 또는 System.Data.Objects.ObjectContext.Detach(System.Object) 메서드를 호출하고 분리되는 개체에 대한 참조를 전달하여 개체를 분리할 수 있습니다.

' Detach the first SalesOrderDetail in the collection. 
context.Detach(order.SalesOrderDetails.First())
// Detach the first SalesOrderDetail in the collection.
context.Detach(order.SalesOrderDetails.First());

개체 분리 시 고려 사항

개체를 분리할 때는 다음 사항을 고려해야 합니다.

  • Detach는 메서드에 전달되는 특정 개체에만 적용됩니다. 분리할 개체의 관련 개체가 개체 컨텍스트에 있는 경우 해당 개체는 분리되지 않습니다.

  • 독립 연결에서는 분리된 개체에 대해 관계 정보가 유지되지 않습니다.

  • 개체가 분리될 경우 개체 상태 정보가 유지되지 않습니다. 여기에는 추적된 변경 내용과 임시 키 값도 포함됩니다.

  • 개체를 분리해도 데이터 소스의 데이터에는 영향이 없습니다.

  • 식별 관계의 하위 삭제 지시문 및 참조 제약 조건은 분리 작업 동안 적용되지 않습니다.

  • 개체 분리 작업을 수행하는 데 필요한 추가 작업과 개체 분리를 통해 얻을 수 있는 장점을 고려해야 합니다. 다른 데이터 집합이 포함된 새 폼이 표시될 때처럼 사용자 데이터의 범위가 변경된 경우 단순히 기존 ObjectContext에서 개체를 분리하기보다는 새 ObjectContext 인스턴스를 만드는 것이 좋습니다.

자세한 내용은 방법: 개체 컨텍스트에서 개체 분리(Entity Framework)를 참조하십시오.

단원 내용

방법: 관련 개체 연결(Entity Framework)

방법: 분리된 개체에 대한 변경 내용 적용(Entity Framework)

방법: 개체 컨텍스트에서 개체 분리(Entity Framework)

참고 항목

개념

n 계층 응용 프로그램 작성(Entity Framework)