2010-07-12 2 views
0

나는 특정 고객에 대한 모든 연락처를 저장하는 Contact 클래스를 포함하는 Customer 클래스를 가지고 있으므로 외래 키 관계로 연결됩니다.Entity Framework 4.0의 롤백

내 시나리오는 다음과 같습니다. 사용자가 연락처를 포함한 고객 정보를 편집 한 다음 "취소"버튼을 누르기로 결정했습니다. 연락처는 그리드에 바인딩되어 있으므로 편집/추가/삭제가 수행 될 때마다 캐시 된 데이터베이스 컨텍스트의 Contact 엔티티가 자동으로 업데이트됩니다. 연락처 엔티티에 대한 사용자의 모든 변경 사항을 어떻게 롤백 할 수 있습니까?

public static void CustomerRollback(Customer customer) 
    { 
     dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, customer); 
     dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, customer.Contacts); 
    } 

하지만 그건 작동하지 않았다 :

나는은 다음 (답변 구글을 검색 한 후)했습니다. 다른 아이디어? 내 문제는 연락처 개체를 롤백하는 것입니다. 우선 무엇이 문제를 일으키는지는 그리드가 캐시 된 항목을 자동으로 업데이트한다는 것입니다. 그래서 취소하려고하면 각 연락처의 EntityState가 이미 수정 된 상태 (EntityState.Added, EntityState.Deleted 등)로 변경되었습니다. 연락처를 반복하고 EntityState 속성을 확인하고 그 속성을 확인해야합니까?

감사 시저

+2

이 컨텍스트는 작업 단위를위한 것입니다. 작업을 "롤백"하는 방법은 컨텍스트를 처리하는 것입니다. 당신이 너무 오랫동안 컨텍스트를 유지하고있는 것 같습니다. 이것은 광범위하고 부정적인 결과를 낳습니다. –

+0

u와 Devart는 아래에서 컨텍스트 폐기를 제안했지만 데이터베이스에서 모든 데이터를 다시 가져와야한다는 의미는 아닙니다. 그것은 성능을 저해 할 것입니다. 그런데 응용 프로그램을 시작할 때이 문제가 너무 일찍 발생하기 때문에 컨텍스트가 너무 길어지는 문제는 아닙니다. 그리고 나는 그것을 테스트하는 유일한 사용자이므로 아무런 동시성 문제도 발생하지 않습니다. – Caesar

+0

조기에 최적화 중입니다. 싱글 톤 컨텍스트를 사용하는 경우 장기간 성능이 떨어질 수 있습니다. 성능상의 상상력 때문에 올바른 방법을 거부하는 대신, 의도 한대로 컨텍스트를 사용하고 프로파일 링 및 포인트 수정을 통해 성능 문제를 해결하십시오. –

답변

2

그래서 여기 엔 Entity Framework 1.0의 임시 해결책이 있습니다. EF 4.0에는 개체 컨텍스트를 롤백하는 훨씬 간단한 방법이 필요했습니다. 더 나은 방법을 알고 있다면 나와 공유하십시오. 이것은 당분간 작동하는 것 같습니다.

 // delete added objects that did not get saved 
     foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) 
     { 
      if (entry.Entity != null) 
       dbContext.DeleteObject(entry.Entity); 
     } 
     // Refetch modified objects from database 
     foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) 
     { 
      if (entry.Entity != null) 
       dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity); 
     } 
     // Recover modified objects that got deleted 
     foreach (var entry in dbContext.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) 
     { 
      if (entry.Entity != null) 
       dbContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, entry.Entity); 
     } 

     dbContext.AcceptAllChanges(); 
1

AcceptAllChanges 방법을 살펴보십시오. SaveChanges(SaveOptions)도 도움이 될 수 있습니다.
ObjectContext 인스턴스를 Unit Of Work로 사용하고 작업을 위해이 인스턴스를 만들고 필요한 경우에만 사용자가 필요하다고 확인한 경우에만 변경 사항을 저장하여 다른 경우의 컨텍스트를 삭제하면됩니다. 문맥에 대한 변화.

+0

하지만 컨텍스트를 처리하면 응용 프로그램의 나머지 부분에 대해 다시 모든 데이터를 다시 가져와야 할 것입니다 ... 그것은 나쁠 것입니다. 작업 단위 (Unit of Work)에 대한 귀하의 제안을 말씀 드리겠습니다. 감사합니다. – Caesar