62

Entity Framework에서 내 엔티티 컨텍스트에 저장되지 않은 변경 사항이 있는지 여부를 확인하는 방법이 있습니까?보류중인 변경 사항이 있는지 확인하십시오.

+0

context.savechanges()가 자동으로 이것을 확인하지 않습니까? 내가 요청하는 이유는 몇몇 사람들이 다음을 시도 할 것이라고 생각한다는 것입니다 :'if (db.ChangeTracker.HasChanges()) {await db.SaveChangesAsync(); }' – Zapnologica

답변

57

이 (변경하여 추가 의미하는 경우, 제거 및 단체를 수정)를 작동 할 수 있습니다 :

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count() 
        ) > 0; 

편집 :

향상된 코드 : 당신의 사람들을 위해

bool changesMade = context. 
        ObjectStateManager. 
        GetObjectStateEntries(EntityState.Added | 
             EntityState.Deleted | 
             EntityState.Modified 
             ).Any(); 
+11

+1은 일반적으로 올바른 경로에 있지만, 'Count()> 0'이 아닌'Any()'를 사용하십시오. –

+0

오늘은이 blogpost를 읽으십시오. 감사합니다;) – Yakimych

+0

EF는 값이 정말로 다른지 ('EntityState.Modified'의 경우) 확인하지 않습니다. e.q. 값을 단독으로 바꾸면 EF는'1 modified object'를 반환합니다. 값이 다른지 미리 확인해야합니다. –

40

EF 4+를 사용하는 경우 확장 메서드와 동일한 솔루션이 있습니다.

public static class DbContextExtensions { 
    public static Boolean HasPendingChanges(this DbContext context) { 
     return context.ChangeTracker.Entries() 
         .Any(e => e.State == EntityState.Added 
          || e.State == EntityState.Deleted 
          || e.State == EntityState.Modified); 
    } 
} 

값을 비트 마스크로 결합 할 수 없습니다. 함수 GetObjectStateEntries()이 논리를 처리했지만 LINQ가 올바른 결과를 생성하지 않습니다.

+4

감사합니다. 네가하는 동안 받아 들여진 대답이 나를 위해 작동하지 않았다. (EF v.4.3). – Christian

+1

'EntityState.Added'에 대한'EntityState'는'System.Data.'가 아닌'System.Data.Entity'에서 온 것입니다. – Yuck

68

EF 6부터는 context.ChangeTracker.HasChanges()입니다.

+1

최신 답변. – Zapnologica

+1

2016 년 현재이 답변입니다, IMHO. – ozgur

+0

다른 사람들이 언급 한 것처럼 지금은 이것이 가장 좋은 대답입니다. – Yokomoko

관련 문제