2016-10-07 5 views
0

엔티티 프레임 워크에서 자체 참조와 관련하여 응용 프로그램의로드를 결정하기 위해 질문이 있습니다.엔티티 프레임 워크 - 자체 참조

불행히도 나는 테이블에 관계가 있습니다. 이 때문에 일부 자체 참조 개체가 있습니다. 예를 들어 : -> 고객 -> 입력 -> 회사 - 회사는

(회사 ... 고객이 일부 항목에 이러한 항목이 다른 고객을 포함하는 회사에 매핑되는 속한 일부 고객이있다> 고객 ....)

json 문자열에서 이것을 직렬화 할 때 자체 참조 루프에 관한 오류 메시지가 표시됩니다 (명확함) 엔티티 프레임 워크에서이 쿼리를 작성하면 오류 메시지. 그러나 디버거를 살펴보면 "루프"를 볼 수 있습니다.

내 질문 : 내 서버에 높은 성능의 부하가 발생합니까? 또는이 다른 처리됩니다, 그래서 C#에서이 자체 참조를 무시할 수 있습니다?

그렇지 않으면 나는

난 그냥 내가 테이블에 더 많은 항목을했습니다 때 서버 부하에 대한 문제를 방지하려면 ... 나는 테이블의 관계에 대한 변경을해야 생각합니다.

미리 감사드립니다.

답변

0

Lazy Loading에 대한 기사가 도움이 될 것이라고 생각합니다. 다음 부분을 보자.

지연 로딩은 엔티티 또는 엔티티를 참조하는 속성에 처음 액세스 할 때 엔티티 또는 엔티티 집합이 데이터베이스에서 자동으로로드되는 프로세스입니다. POCO 엔티티 유형을 사용할 때, 지연로드는 파생 된 프록시 유형의 인스턴스를 작성한 다음 가상 특성을 대체하여로드 훅을 추가함으로써 성취됩니다.

...

게으른 로딩 및 직렬화 잘 혼합하지 않으며, 당신이 조심하지 않으면 당신은 게으른 로딩을 사용해서 전체 데이터베이스에 대한 쿼리를 끝낼 수 있습니다. 대부분의 serializer는 유형 인스턴스의 각 속성에 액세스하여 작동합니다. 속성 액세스는 지연로드를 트리거하므로 더 많은 엔티티가 직렬화됩니다. 이러한 엔티티에서 속성에 액세스하고 더 많은 엔티티가로드됩니다.

성능에 대한 질문 - Entity Framework는 액세스 할 때 참조 된 속성에 대한 데이터를로드합니다.

그리고 당신은 엔티티 프레임 워크 클래스를 직렬화하려면, 당신은 LazyLoading하고

public Company GetCompany(int id) 
{ 
    using (var context = new DBData()) 
    { 
     context.Configuration.LazyLoadingEnabled = false; 
     return context.Set<Company>() 
      .Include(x => x.Customer)//you can add other includes which you want 
      .Where(x => x.Id == id).FirstOrDefault(); 
    } 
} 

를 직렬화하고 싶은 열망 부하보다 데이터 만, 비활성화 할 수 있습니다하지만 내가보기 엔 만 속성으로 다른 클래스를 생성하는 것이 좋습니다되는 직렬화하고 EF 클래스의 데이터를 새 클래스 (AutoMapper을 사용하거나 수동으로)에 매핑하고 안전을 위해 직렬화하기를 원할 것입니다.

+0

로드 중 하나를 계속 활성화하려면 참조가 직렬화 중에 다른 방식으로 처리 될 수 있습니다 (Json.NET을 사용하는 다른 질문의 예 : http://stackoverflow.com/a/). 8711702/1234773) – Jodacola

+0

주요 문제는 엔티티 프레임 워크가 어떻게 작동 하는지를 이해하는 것입니다. 나는 내 C# 코드에서 끝없는 반복을 가질 것이라고 생각했다. 하지만 지금은 그것이 어떻게 작동하는지 보이는 것입니다. 그것은 primaray와 외래 키로 연결된 엔티티가 두 개 밖에없는 경우에도 발생합니다. 첫 번째 객체의 프로퍼티를 열어 다른 객체를 열 수 있으며이 현재 객체에서 첫 번째 객체 속성을 열 수 있습니다. 그래서 나는 그것이 끝없는 반복 일 것이라고 생각했으나 그렇게 보이지는 않습니다 ... – AJRames

+1

EF는 탐색 속성을 기본적으로로드하지 않습니다. 처음 액세스 할 때 (Lazy Loading) 또는'.Include' (Eager Loading)에 지정할 때로드 할 것입니다. 그래서 당신이이 글을 쓸 때'var item = Context.Set () .Find (1); var customer = item.Customer;'EF는 데이터베이스에 두 개의 쿼리를 수행합니다. '.Find()'를 호출하면 첫 번째로드 전용 회사 필드 (탐색 속성없이)가 표시되고'.Customer' 속성에 액세스 할 때 두 번째 쿼리가 수행되고 고객 필드도 탐색 속성없이로드됩니다. – YuriyP

관련 문제