Entity Framework에서 내 엔티티 컨텍스트에 저장되지 않은 변경 사항이 있는지 여부를 확인하는 방법이 있습니까?보류중인 변경 사항이 있는지 확인하십시오.
답변
이 (변경하여 추가 의미하는 경우, 제거 및 단체를 수정)를 작동 할 수 있습니다 :
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();
+1은 일반적으로 올바른 경로에 있지만, 'Count()> 0'이 아닌'Any()'를 사용하십시오. –
오늘은이 blogpost를 읽으십시오. 감사합니다;) – Yakimych
EF는 값이 정말로 다른지 ('EntityState.Modified'의 경우) 확인하지 않습니다. e.q. 값을 단독으로 바꾸면 EF는'1 modified object'를 반환합니다. 값이 다른지 미리 확인해야합니다. –
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가 올바른 결과를 생성하지 않습니다.
EF 6부터는 context.ChangeTracker.HasChanges()
입니다.
최신 답변. – Zapnologica
2016 년 현재이 답변입니다, IMHO. – ozgur
다른 사람들이 언급 한 것처럼 지금은 이것이 가장 좋은 대답입니다. – Yokomoko
context.savechanges()가 자동으로 이것을 확인하지 않습니까? 내가 요청하는 이유는 몇몇 사람들이 다음을 시도 할 것이라고 생각한다는 것입니다 :'if (db.ChangeTracker.HasChanges()) {await db.SaveChangesAsync(); }' – Zapnologica