2012-02-01 6 views
2

I 사용자가 어떤 값을 변경하기로 결정하고 값이 될 여러에서 (하나 개의 값을 변경 한 곳이 저장된 것 후 바로 데이터베이스Entity Framework 개체가 변경되었는지 확인하는 방법은 무엇입니까?

var konsultant = uczestnik.Konsultanci; 
uczestnik.Konsultanci = null; // null attached object and reuse it's ID later on for SAVE purposes 
uczestnik.KonsultantNazwa = konsultant.KonsultantNazwa; 
uczestnik.Szkolenie = null; // null attached object and reuse it's ID later on for SAVE purposes 
uczestnik.SzkolenieID = szkolenie.SzkolenieID;      
context.SzkolenieUczestnicies.AddObject(uczestnik); 
context.SaveChanges(); 
context.Detach(uczestnik); // detatch to prevent Context problems 
uczestnik.Szkolenie = szkolenie;// reassign for use in ObjectListView 
uczestnik.Konsultanci = konsultant; // reassign for use in ObjectListView 

에 저장있어 Uczestnik라고 물체가 다시 ObjectListView에있어했습니다 정확한). 값의 엔티티 상태를 확인하면 Unchanged 상태이므로 .Attach 및 .SaveChanges()를 호출하면 아무 것도 수행하지 않습니다. ChangeObjectState을 사용할 수 있지만 변경된 사항이 없으면 그렇게하는 것이 좋습니다. 나는 변화를 감지하고 불필요한 트래픽을 방지 할 수있는 방법

context.SzkolenieUczestnicies.Attach(uczestnik); 
//context.ObjectStateManager.ChangeObjectState(uczestnik, EntityState.Modified); 
context.SaveChanges(); 

그래서 resaving가 이해되지 않는다 (나는 아무것도 파일이 큰 5MB 보유 목적 변경되지 않는 상황을 상상할 수 있습니다.) Entity가 하나의 필드 만 15에서 변경되었고 해당 필드 만 변경하는 것을 감지 할만큼 똑똑하지 않은가?

+0

ObjectContext.DetectChanges를 보았습니까? –

+0

아니요, 알고 계시지 않습니까? 어떻게 사용합니까? 또한 컨텍스트가'using'으로 묶여 있다고 가정하면 DetectChanges는 새로운 컨텍스트에서 실행될 때 아무 것도 표시하지 않겠습니까? – MadBoy

답변

3

Detach 엔티티 인 경우 컨텍스트에 의해 추적되지 않습니다. 이 경우 객체가 변경된 시점을 감지하고 변경 내용을 문맥에 알릴 책임은 ChangeObjectState입니다. 따라서 사용자가 엔티티에 직접 수정하거나 구현 한 항목을 추적해야합니다. 예를 들어 INotifyPropertyChanged을 구현합니다 (EntityObject 기반 엔터티를 사용하는 경우이 인터페이스는 이미 구현되어 있어야 함).

+0

업데이트가 다른 14 개의 열을 건드릴 수 없도록 15 개 열의 값 하나만 변경되었다는 사실을 컨텍스트에 알리는 방법 (또는 하나에 대한 링크)을 보여줄 수 있습니까? – MadBoy

+1

[this] (http://stackoverflow.com/questions/3729044/how-can-i-update-a-single-field-from-anentity-with-entity-framework/3730581#3730581) –

+0

감사합니다. . 굉장히 유용하다. 이 블로그와 같은 일부 변경 사항이있는 자체 추적 엔티티에 대한 기사를 보았습니다. http://blogs.msdn.com/b/adonet/archive/2011/02/09/self-tracking-entities-original-values-and- update-customization.aspx 좋은 생각인지 알고 있습니까? 아니면 자신의 방식으로 직접해야합니까? – MadBoy

5

엔티티가 컨텍스트에서 분리 된 경우 데이터베이스에서 원래 엔티티를 다시로드하거나 자체 추적 엔티티를 사용하거나 어떻게 든 자신을 추적 관리하지 않는 한 변경된 내용을 알 수 없습니다. 당신이 개체를 다시로드하면

당신은 ApplyCurrentValues를 사용할 수 있습니다

var originalEntity = context.MyEntities.Single(e => e.Id == detachedEntity.Id); 
context.MyEntities.ApplyCurrentValues(detachedEntity); 
context.SaveChanges(); 

이 방법은 원본과 분리 된 엔티티 사이의 서로 다른 값이 수정 된 속성을 표시합니다. SaveChanges은 변경된 특성 만 포함하는 UPDATE 문을 작성합니다. 속성이 변경되지 않은 경우 SaveChanges은 아무 작업도 수행하지 않습니다.

하지만 원래 엔티티를로드해야하기 때문에 "불필요한 트래픽"이 전혀 없으므로 불필요한 UPDATE 문을 저장하게됩니다.

+0

고마워, 가장 좋은 방법은 @ Ladislav Mrnka와 같은 추적을 구현하는 것입니다. 이 프로그램은 WAN 링크를 통해 작동하고 Documents를 여러 번 동기화하여 500KB 또는 20MB로 작게 만들 수 있습니다. DB에서 다시로드하기로 결정한 경우 킬러가 될 수 있습니다. – MadBoy

관련 문제