자동 추적 엔터티 작업
Entity Framework 응용 프로그램에서 개체 컨텍스트는 개체 그래프에 있는 엔터티의 변경 내용을 추적합니다. 그러나 N 계층 시나리오에서는 엔터티를 수정하는 계층에서 개체 컨텍스트를 사용하지 못할 수도 있습니다. .NET Framework 버전 4부터는 자동 추적 엔터티를 사용하여 모든 계층에서 변경 내용을 추적할 수 있습니다.
참고: |
---|
개체 그래프가 변경된 계층에서 개체 컨텍스트를 사용할 수 없는 경우에만 자동 추적 엔터티를 사용합니다. 개체 컨텍스트를 사용할 수 있는 경우에는 EntityObject 파생 형식이나 "일반 이전" CLR 개체(POCO) 형식 또는 POCO 프록시 형식을 사용합니다. 자세한 내용은 개체 사용(Entity Framework)을 참조하십시오. |
Microsoft Visual Studio 2010부터 ADO.NET 자동 추적 엔터티 생성기 템플릿에서 자동 추적 엔터티를 생성합니다. 이 템플릿 항목은 두 개의 .tt(텍스트 템플릿) 파일인 <model name>.tt와 <model name>.Context.tt를 생성합니다. <model name>.tt 파일은 자동 추적 엔터티에서 상태를 설정할 수 있도록 하는 확장 메서드와 자동 추적 엔터티에 사용되는 변경 내용 추적 논리가 포함된 도우미 클래스 및 엔터티 형식을 생성합니다. <model name>.Context.tt 파일은 ObjectContext 및 ObjectSet 클래스에 대한 ApplyChanges 메서드가 포함된 확장 클래스와 형식화된 ObjectContext를 생성합니다. 이러한 메서드는 자동 추적 엔터티의 그래프에 포함된 변경 내용 추적 정보를 검사하여 데이터베이스에 변경 내용을 저장하기 위해 수행해야 하는 작업 집합을 유추합니다. 자세한 내용은 ADO.NET Self-Tracking Entity Generator Template을 참조하십시오.
참고: |
---|
서비스에서는 신뢰할 수 없는 채널을 통해서나 신뢰할 수 없는 클라이언트에서 데이터를 검색하거나 업데이트하는 요청을 신뢰해서는 안 됩니다. 클라이언트를 인증해야 하며, 보안 채널이나 메시지 봉투를 사용해야 합니다. 클라이언트의 데이터 업데이트 또는 검색 요청은 지정된 시나리오에서 예상되는 정당한 변경을 따르는지 확인하기 위해 유효성이 검사되어야 합니다. |
참고: |
---|
엔터티 키로 중요한 정보(예: 주민 등록 번호)를 사용하지 마십시오. 이는 자동 추적 엔터티 그래프의 중요한 정보를 완전히 신뢰할 수 없는 클라이언트로 잘못 serialize하는 가능성을 줄이기 위해서입니다. 독립 연결을 사용하는 경우 serialize(직렬화)될 항목과 관련된 엔터티의 원래 키가 클라이언트로 전송될 수도 있습니다. |
자동 추적 엔터티 확장 메서드
다음 확장 메서드는 자동 추적 엔터티에 적용할 수 있습니다. 엔터티 하나가 아니라 엔터티 집합에서 이러한 작업을 수행하려는 경우 자동 추적 엔터티 집합 작업을 참조하십시오.
StartTracking 메서드
StartTracking 메서드는 엔터티에 적용되는 모든 변경 내용의 기록을 시작하도록 엔터티의 변경 내용 추적기에 지시합니다. 이러한 변경에는 스칼라 속성, 컬렉션 및 다른 엔터티에 대한 참조의 변경이 포함됩니다. 자동 추적 엔터티는 WCF(Windows Communication Foundation)를 통해 클라이언트에 deserialize(역직렬화)될 때 자동으로 추적을 시작합니다. 다음 시나리오에서는 새로 만든 엔터티에 대한 추적도 설정됩니다.
새 엔터티와 변경 내용을 이미 추적하고 있는 엔터티 간의 관계가 만들어져 있습니다.
MarkAs[State] 또는 AcceptChanges 메서드가 엔터티에 대해 호출됩니다.
StopTracking 메서드
StopTracking 메서드는 변경 내용의 기록을 중지합니다.
MarkAs 메서드
모든 MarkAs 메서드는 추적을 설정합니다. 이러한 확장 메서드는 엔터티의 상태를 명시적으로 Added, Modified, Deleted 및 Unchanged로 변경하는 데 도움이 됩니다.
MarkAs[State] 메서드는 수정된 상태와 함께 해당 메서드가 적용된 동일한 엔터티를 반환합니다. 다음 예제에서는 엔터티의 상태를 Unchanged로 수정합니다.
department.Course = new Course { CourseID = courseID }.MarkAsUnchanged();
MarkAsAdded 메서드는 엔터티의 상태를 Added로 변경합니다. 새로운 자동 추적 엔터티는 변경 내용 추적이 설정되지 않고 Added 상태로 만들어집니다.
MarkAsDeleted 메서드는 엔터티의 상태를 Deleted로 변경합니다. 이 메서드는 삭제 표시 중인 엔터티의 탐색 속성도 지웁니다. 참조 개체를 가리키는 경우 탐색 속성은 null로 설정됩니다. 탐색 속성이 컬렉션을 나타내는 경우 Clear 메서드가 호출됩니다. 컬렉션에 포함된 개체에 대해 MarkAsDeleted를 호출하면 개체가 컬렉션에서 제거됩니다. 컬렉션의 각 개체를 삭제된 것으로 표시하려면 컬렉션 복사본에서 개체를 표시합니다. 컬렉션 복사본을 가져오려면 다음 예제와 같이 컬렉션에 대해 ToArray() 또는 ToList() 메서드를 호출합니다.
List<Course> courses = department.Courses.ToList();
foreach (var c in courses)
{
// Mark each course in the department as Deleted.
c.MarkAsDeleted();
}
MarkAsModified 메서드는 엔터티의 상태를 Modified로 변경합니다. 또한 변경 내용 추적이 설정된 엔터티에서 속성 값을 수정하면 상태가 Modified로 설정됩니다.
MarkAsUnchanged 메서드는 엔터티의 상태를 Unchanged로 변경합니다. 또한 AcceptChanges는 엔터티에 대한 변경 내용 추적 정보를 지우고 상태를 Unchanged로 변경합니다.
AcceptChanges
AcceptChanges 메서드는 엔터티에 대한 변경 내용 추적 정보를 지우고 상태를 Unchanged로 변경합니다. 관계의 상태를 다시 설정하려면 관계에 참여하는 두 엔터티에서 AcceptChanges를 호출합니다.
ObjectContext 확장 메서드
ApplyChanges 메서드는 자동 추적 엔터티의 그래프에 포함된 변경 내용 추적 정보를 검사하고 데이터베이스에 변경 내용을 반영하기 위해 수행해야 하는 작업 집합을 유추합니다. 두 가지 ApplyChanges 메서드가 있는데 그중 하나는 ObjectContext용이고 다른 하나는 ObjectSet용입니다.
참고: |
---|
중요한 데이터가 포함된 예외 메시지를 클라이언트 계층에 전파하지 않으려면 서버 계층에 대한 ApplyChanges 및 SaveChanges 호출이 예외 처리 코드에 래핑되어야 합니다. |
자동 추적 엔터티로 작업하는 경우의 고려 사항
자동 추적 엔터티로 작업하는 경우 고려할 사항은 다음과 같습니다.
클라이언트 프로젝트에 엔터티 형식을 포함하는 어셈블리에 대한 참조가 있는지 확인합니다. 클라이언트 프로젝트에 서비스 참조만 추가하는 경우 클라이언트 프로젝트는 실제 자동 추적 엔터티 형식이 아니라 WCF 프록시 형식을 사용합니다. 즉, 클라이언트의 엔터티 추적을 관리하는 자동화된 알림 기능을 사용할 수 없습니다. 의도적으로 엔터티 형식을 포함하지 않으려는 경우 변경 내용을 다시 서비스에 보내기 위해 클라이언트에서 수동으로 변경 추적 정보를 설정해야 합니다.
서비스 작업 호출은 상태 비저장이어야 하며 개체 컨텍스트의 새 인스턴스를 만들어야 합니다. 또한 using 블록에서 개체 컨텍스트를 만드는 것이 좋습니다.
클라이언트에서 수정된 그래프를 서비스에 보낸 다음 클라이언트에서 동일한 그래프로 계속 작업하려는 경우 그래프를 수동으로 반복하고 각 개체에서 AcceptChanges 메서드를 호출하여 변경 내용 추적기를 다시 설정해야 합니다. 그래프의 개체에 속성과 데이터베이스에서 생성된 값(예: ID 또는 동시성 값)이 포함되어 있는 경우 SaveChanges 메서드가 호출된 후 Entity Framework 에서 이러한 속성 값을 데이터베이스에서 생성된 값으로 바꿉니다. 저장된 개체나 개체에 대해 생성된 속성 값 목록을 클라이언트에 다시 반환하기 위해 서비스 작업을 구현할 수 있습니다. 그러면 클라이언트가 개체 인스턴스나 개체 속성 값을 개체 또는 서비스 작업에서 반환된 속성 값으로 바꿉니다.
여러 서비스 요청의 그래프를 병합하면 결과로 생성된 그래프에 중복 키 값을 가진 개체가 발생할 수 있습니다. Entity Framework 에서는 ApplyChanges 메서드를 호출할 때 중복 키를 가진 개체를 제거하지 않고 대신 예외를 throw합니다. 그래프에 중복 키 값이 없도록 하려면 자동 추적 엔터티: ApplyChanges 및 중복 엔터티 블로그에 설명된 패턴 중 하나를 따르십시오.
외래 키 속성을 설정하여 개체 간의 관계를 변경하는 경우 참조 탐색 속성이 null로 설정되고 클라이언트에서 해당하는 주 엔터티에 동기화되지 않습니다. 그래프가 개체 컨텍스트에 연결된 후(예를 들어, ApplyChanges 메서드를 호출한 후) 외래 키 속성과 탐색 속성이 동기화됩니다.
참조 탐색 속성을 해당하는 주 개체와 동기화하지 않으면 외래 키 관계에서 하위 삭제를 지정한 경우 문제가 발생할 수 있습니다. 주체를 삭제해도 종속 개체에 삭제가 전파되지 않습니다. 하위 삭제를 지정한 경우 외래 키 속성을 설정하는 대신 탐색 속성을 사용하여 관계를 변경합니다.
자동 추적 엔터티는 지연 로드를 수행할 수 있도록 설정되지 않습니다.
ADO.NET 자동 추적 엔터티 생성기 템플릿에서 생성된 코드는 이진 serialization 및 ASP.NET 상태 관리 개체로의 serialization을 지원하지 않습니다. 하지만 템플릿을 사용자 지정하여 이진 serialization 지원을 추가할 수 있습니다. 자세한 내용은 자동 추적 엔터티에서 이진 serialization 및 ViewState 사용을 참조하십시오.
참고 항목
작업
연습: 자동 추적 엔터티 serialize(Entity Framework)
기타 리소스
자동 추적 엔터티 집합 작업
Silverlight의 자동 추적 엔터티
자동 추적 엔터티에서 이진 serialization 및 ViewState 사용