2012-09-03 3 views
9

EF로로드 한 데이터 목록이있는 눈금이있는 WPF 응용 프로그램이 있습니다. 다른 윈도우는 그리드에로드 된 동일한 데이터를 변경하지만 다른 dbcontext 인스턴스를 사용할 수 있습니다. 그리드에서 변경된 데이터를 보려면 어떻게해야합니까? ctx.Entry<MyEntity>(instance).Reload();으로 단일 개체를 새로 고칠 수 있다는 것을 알고 있지만 모든 변경 사항을보고 싶습니다. 그리고 내가하는 일과 관계없이 이전 값만 볼 수 있습니다. 이 경우에는 AsNoTracking을 사용하여 DbContext 인스턴스를 새로 만들 수 없습니다.다른 DbContext에서 변경 내용로드

+0

왜 'AsNoTracking'을 사용할 수 없습니까? –

+0

사용자가 눈금을 직접 변경하여 저장할 수 있기 때문에. – user1526627

+0

그런 경우 저장하지 않은 데이터를 편집 할 수 있으며 다시로드하면 데이터가 달라질 수 있습니다. 그러한 문제를 어떻게 해결하고 싶습니까? –

답변

13

매우 간단한 경우처럼 보입니다. 왜 EF가 단지 엔티티 값을 업데이트하지 않는지 알 수 없습니다.

EF에도이 메커니즘이 있지만 DbContext API에는 노출되지 않습니다. ObjectContext로 되돌아 가야합니다. 방금 엔티티 세트 다시로드하려는 경우 호출됩니다

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload); 

RefreshMode.StoreWins 모든 보류중인 변경 내용이 다시로드 값으로 덮어 쓰게됩니다. RefreshMode.ClientWins을 사용하여 변경 사항을 유지하고 다시로드 된 데이터와 병합 할 수도 있습니다. 이 접근 방식의 문제점은 이미 가지고있는 엔티티 만 다시로드한다는 것입니다. 당신은 새로운 실체를 얻지 못할 것입니다.

당신은 새로운 엔티티를 얻을뿐만 아니라 쿼리를 실행해야하고 당신이 값을 다시로드 할 EF 알려 주어야합니다 : 다시

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
var objectSet = objectContext.CreateObjectSet<MyEntity>(); 
objectSet.MergeOption = MergeOption.OverwriteChanges; 
var result = objectSet.Where(...).ToList(); 

MergeOption.OverwriteChanges 모든 보류중인 변경 내용을 덮어을하지만 병합 MergeOption.PreserveChanges을 사용할 수 있습니다 편집 된 값에 값을 다시로드했습니다.

필자는 데이터베이스에서 삭제 된 엔티티와 관계가있는 리프레시와 관련된 문제가 여전히있을 수 있다고 생각합니다.

+0

이것은 정확하게 내가 필요로하는 것입니다. 감사합니다. EF에 대한 나의 믿음이 회복되었습니다 :) – user1526627

+0

@ ladislav-mrnka 질문 하나, 마지막 단계가 정말로 필요한 것입니까? 내가 너를 올바르게 이해했다면, EF는 이미 이미로드 된 레코드에 대한 변경 사항을 인식하고 첫 번째 방법으로 병합합니다. 따라서 테이블에 새로운 행을 수동으로 추가하는 경우 첫 번째 방법을 사용하여 dbcontext로 업데이트되지 않습니다. 나는 이것을 시도하고 두 번째 방법이 필요 없다는 것을 알았다. 어쩌면 행동이 바뀌거나 완전히 오해 한 것일까 요? :) – DrCopyPaste