2011-05-05 5 views
4

EF 4, POCO를 사용하고 있습니다. 작업은 데이터베이스에서 가져와 연결 해제 된 모드에서 업데이트 (추가, 업데이트, 삭제 작업)해야하는 DomainObject 유형의 긴 데이터 집합을 갖는 것입니다. 나중에 업데이트 된 세트를 데이터베이스로 다시 푸시 할 수 있습니까? 우리가 데이터를로드하기 때문에 테이블에 평행 한 변화가 없다고 가정합니다. 나는 context.SaveChanges()가 업데이트를 수행하지만 문제는 모든 변경 사항을 좀더 List에서 DbSet으로 되돌려 놓는 방법인가 아니면 단절 모드에서 DbSet을 사용하여 직접 작업 할 수있는 방법인가하는 것입니다. 감사!EF 4 : 연결이 끊긴 데이터 집합을 업데이트하는 방법은 무엇입니까?

답변

7

자동 추적 개체는 EDMX + ObjectContext는의 API의 기능입니다 DbSet) 사용할 수 없습니다. 자체 추적 엔티티는 변경 세트 패턴 (예 : 이전 데이터 세트)의 구현입니다. SO의 일부 참조 : 당신이 대답은 아주 간단합니다 자동 추적 엔터티를 사용하지 않는 경우

- 당신은 당신이 한 변화 EF 무슨 말을해야합니다. 분리 된 엔티티를 사용하고 나면 엔티티를 새로운 컨텍스트에 다시 첨부하고 삽입 된 내용, 업데이트 된 내용, 삭제 된 내용 및 관계를 어떻게 변경했는지 수동으로 정확히 말해야합니다. 이 프로세스의 핵심 구성 요소는 DbContext API (context.ChangeTracker)의 ObjectContext API (context.ObjectStateManager) 또는 DbChangeTracker에서 ObjectStateManager입니다. 많은 사람들이 일반적으로 다른 프로세스를 사용하여 관계를 처리 할 때 이것은 매우 어렵습니다. 우리는 엔티티 그래프를 다시로드하고 분리 된 엔티티 그래프에서 변경 사항을 첨부 된 엔티티 그래프로 병합합니다. 일부 참조 :

전체 프로세스가 당신이 원하는 업데이트의 수에 따라 매우 느릴 수 있음을주의하십시오. 이유는 EF doesn't support command batching이므로 각 삽입, 업데이트, 삭제는 데이터베이스에 대한 별도의 왕복으로 실행됩니다. 100.000 복잡한 개체를 업데이트하면 SaveChanges의 실행에 몇 분이 걸릴 것으로 예상 할 수 있습니다.

편집 : 당신은 당신이 "변화"에 대한 정보를 전송하는 트릭을 사용할 수 있습니다 관계없이 개체에서만 작동 매우 특별한 상황에서

가 :

public void ProcessChanges(IEnumerable<DomainObject> entities) 
{ 
    foreach(var entity in entities) 
    { 
     if (entity.Id == 0) 
     { 
      // New entity 
     } 
     else if (entity.Id > 0) 
     { 
      // Modified entity (you cannot say if entity war really modified, 
      // you must update it always). 
     } 
     else 
     { 
      // Use negative Id (origId * -1) to mark entity as deleted 
      // reverse Id and delete entity 
     } 
    } 
} 

이 평면 객체에 대해서만 작동 간단한 키.

+0

게시물을 보내 주셔서 감사합니다. 현장에서 좋은 경험이있는 것 같습니다. 맞아, 나는 POCO를 사용하고있어 STE는 나를 도와주지 않는다. DomainObject의 List를 가지고 무엇이 삽입되거나 업데이트되었는지 어떻게 알 수 있습니까? 업데이트되고 추가 된 레코드에 대해 2 개의 개별 목록이 필요하거나 작업 정보를 저장하기 위해 DomainObject를 확장해야하는 것처럼 보입니까? – YMC

+0

네, 그 정보를 두 번째 데이터 구조 나 도메인 객체로 전달해야합니다. 실제로는 자신의 STE 구현을 의미합니다. 그것은 분명히 당신이 일반적으로 원하지 않는 일이며 분명히 내가 설명한 접근법을 사용하는 이유입니다 : DB에서 엔티티를 로딩하고 변경 사항을 병합하십시오. 그러나 매우 간단한 시나리오에서 수정 작업에 대한 정보를 전송할 수있는 유일한 방법은 내 말은 아닙니다. 샘플을 제 대답에 추가 할 것입니다. –

+0

내 작업을 명확하게하겠습니다. 어쩌면 당신은 해결책을 제안 할 수 있습니다 : 1) 나는 타이어 사이에 데이터를 보낼 필요가 없습니다 .2) 그것은 하나의 일반 도메인 엔티티, 그래프가 아닙니다 .3) 분리 된 데이터 세트를 통해 나는 내 도메인 객체의 일반 일반 목록을 의미했습니다. DbSet을 직접 사용할 수 있습니까? 그 목적은 Db를 한 번 요청한 후 메모리에서 복잡한 처리 (DB를 다루지 않음)를 수행하고, 메모리 구조에 데이터를 요청, 업데이트 및 추가합니다. DB에 직접 작업하는 데 더 많은 시간이 소요됩니다. 마지막으로 DB에 변경 사항을 적용하거나 전체 데이터 세트 (DB 용어로 표)를 대체하여 DB에 대한 변경 사항을 무시하십시오. – YMC

-1
+0

힌트를 보내 주셔서 감사합니다. 나는이 특징을 알지 못했다. 내가 그것을 확인하자. – YMC

+0

또한이 책에서 자체 트러스 팅 엔티티의 훌륭한 예를 찾을 수 있습니다. Entity Framework Recipes : A Problem-Solution Approach Google에서 찾아 보면 미리보기가 표시되며 올바른 예제 –

+0

"Entity Framework Recipes : A Problem-Solution Approach"의 9-5, 9-6, 9-7 및 9-9 섹션 찾기 –

관련 문제