2010-04-26 7 views
20

엔티티 프레임 워크 컨텍스트에 저장되지 않은 데이터가 있는지 확인할 수 있어야합니다. ObjectStateManager를 사용하여 기존 엔티티의 상태를 확인하는 방법을 알아 냈습니다.하지만이 두 가지 문제가 있습니다.컨텍스트의 엔티티가 .Net Entity Framework 4.0으로 더러워 졌는지 확인하는 방법

  1. 컨텍스트의 모든 엔티티를 루핑하는 대신 엔티티가 저장되지 않았는지 확인하기 위해 하나의 함수를 호출하는 것을 선호합니다.
  2. 내가 추가 한 항목을 검색하는 방법을 알 수 없습니다. 이것은 엔티티 컨텍스트가 어떻게 작동하는지 완전히 이해하지 못한다는 것을 나에게 암시합니다. 예를 들어, ObjectSet myContext.Employees가 있고이 세트 (.AddObject 포함)에 새 직원을 추가하면 ObjectSet을 볼 때 새 엔터티가 표시되지 않고 .count도 표시되지 않습니다. 증가하다. 그러나, 컨텍스트를 할 때 .SaveChanges(), 내 새로운 엔티티가 유지됩니다 ... 응?

내 MSDN 검색이에 대한 답변을 찾을 수 없었습니다, 그래서 나를 여기에 누군가가 단서 수있을 것이라고 기대했다. 사전에

감사합니다.

답변

15
var addedStateEntries = Context 
    .ObjectStateManager 
    .GetObjectStateEntries(EntityState.Added); 
+1

좋아, 그 대답을 보인다. ObjectSet myContext.Employees에 방금 추가 한 엔티티가없는 이유에 대해 아직도 혼란 스럽습니다. –

+1

'ObjectSet'는 쿼리가 아니기 때문에 콜렉션이 아닙니다. –

+0

좋습니다, 우리는 ObjectSet이 있어야 할 것에 대해 오해하고 있습니다. 그렇다면 ObjectSets는 엔티티의 데이터베이스 상태 일뿐입니다. 그것이 사실이라면, 예를 들어, 데이터베이스에있는 것뿐만 아니라 메모리에있는 모든 Employee 엔티티가있는 콜렉션이 있습니까? –

3

이 문서에서는 엔티티 프레임 워크에 변경 내용 추적을 수행하는 데 필요한 것을 정확하게 설명 :

Identity Resolution, State Management, and Change Tracking (Entity Framework) - MSDN

+0

최고 :

internal static class ObjectContextExtensions { public static bool IsContextDirty(this ObjectContext objectContext) { return objectContext .ObjectStateManager .GetObjectStateEntries( EntityState.Added | EntityState.Deleted | EntityState.Modified).Any(); } } 

또는 (만 ObjectContext를위한) 부분적인 방법을 통해

. 내가 어떻게 그것을 놓쳤는지 모르겠다. 감사. –

+0

사실, 나는 그 기사를 읽었지만 내 질문에 답하지 않습니다. 나는 .SaveChanges를하면 어떻게되는지 알 필요가있다. context.AddObject로 추가 된 새 엔티티는 컨텍스트 개체의 ObjectSet 속성에 나타나지 않으므로 상태를 확인하기 위해 참조를 얻을 수 없습니다. –

6

재사용 가능한 하나의 메소드/속성을 얻을 수있는 간단한 방법은 당신이 새로운 방법을 추가 할 수 있습니다 부분 클래스를 만들고 다음과 같은 속성을 추가하여 ObjectContext를 만듭니다.

public partial class MyEntityContext 
{ 
    public bool IsContextDirty 
    { 
    get 
    { 
     var items = ObjectStateManager.GetObjectStateEntries(EntityState.Added); 
     if(items.Any()) 
     return true; 
     items = ObjectStateManager.GetObjectStateEntries(EntityState.Deleted); 
     if (items.Any()) 
     return true; 
     items = ObjectStateManager.GetObjectStateEntries(EntityState.Modified); 
     if(items.Any()) 
     return true; 
     return false; 
    } 
    } 
} 

공개 할 수있는 대상에 따라 삭제 또는 수정이 있는지를 알 수있는 다른 속성. 이 방법은 단순화 될 수 있지만, 당신이해야 할 일이 무엇인지 분명히하고 싶었습니다. (모든 ObjectContext를위한)

+3

포스트에서 해당 주제에 대한 새로운 질문을 시작했습니다.'Any()'대신에'Count()> 0'을 사용하지 말고, Count()가 전체 콜렉션을 반복하여 숫자를 얻으면,'Any()'는 첫 번째 반복에서 true를 반환합니다. – Shimmy

+0

또한,'GetObjectStateEntries'는'null'을 반환하지 않습니다. – Shimmy

8

통해 확장 방법 :

partial class MyModel 
{ 
    public bool IsContextDirty() 
    { 
     return ObjectStateManager 
      .GetObjectStateEntries(
       EntityState.Added | 
       EntityState.Deleted | 
       EntityState.Modified).Any(); 
    } 
} 
관련 문제