2009-11-10 3 views
1

ADO.NET Entity Framework를 사용하면서 반복적으로 이와 같은 코드를 반복적으로 반복합니다.ADO.NET 엔터티 프레임 IsLoaded 및로드

VB :

' Load the thing if not already loaded. ' 
If Not Something.Thing.IsLoaded Then 
    Something.Thing.Load() 
End If 

C 번호 :

// Load the thing if not already loaded. 
if (!Something.Thing.IsLoaded) 
{ 
    Something.Thing.Load(); 
} 

이 정상인가요? IsLoadedLoad을 너무 자주 사용해야합니까? 아니면 올바르게 사용하지 않습니까?

+1

있지 않는 게으른 로딩 사람들이 엔티티 프레임 워크와 함께했던 문제 중 하나였다. – Min

답변

1

예를 들어 7 명의 고객 목록을로드 한 다음 각 고객에 대한 주문을로드하는 경우.

고객을로드 한 다음 각 고객을 반복하면서 주문이로드되었는지 확인한 다음로드합니다. 당신은 데이터베이스에 8 (1 + 7) 전화를 받게됩니다.

고객을 확보 할 때 대신 Include ("Orders")를 사용하면 루프가없고, if 문이없고, 데이터베이스를 한 번만 호출 할 수 있습니다.

Entity Framework 4에는 지연로드가 있습니다.

+1

Include를 사용한다고해서 데이터베이스에 대한 호출이 여전히 8 번 발생하지는 않을 수도 있습니다. –

4

개체 (예 : 리포지토리)를 호출하는 방법에 따라 수행 할 수있는 작업은 엔터티 기본 집합에 대해 "Include()"메서드를 사용하는 것입니다.

이렇게하면 "물건"이 이미로드 된 개체가 반환됩니다.

는 여기에 대해 좋은 기사입니다 :

http://msdn.microsoft.com/en-us/library/bb896272.aspx

+1

Include는 아무 것도 강제로로드하지 않습니다. 로드 된 상태인지 확인하려면 Include를 사용한 후에도 IsLoaded 및 Load를 호출해야합니다. "열망하는"로드 작업을 포함시켜야하지만 힌트 일뿐입니다. –

1

나는 쉬라즈가 말씀하신 것을 에코. 또한 부분 클래스 내에서 EF 생성 속성을 래핑하여 지연로드를 구현하는 경우가 종종 있습니다. 예를 들면 다음과 같습니다.

public partial class Customer 
{ 
     public EntityCollection<Order> CustomerOrders 
     { 
      get 
      { 
       if (!Orders.IsLoaded) 
        Orders.Load(); 

       return Orders; 
      } 
     } 
} 

발신자 측에서 몇 가지 반복을 저장합니다.

4

VS2010 beta에있는 EntityFramework의 버전은 이와 관련하여 훨씬 친숙합니다. 즉, 당신이 게으른 로딩이없는 버전으로 붙어 있다면,이 확장 방법에 당신을 도울 수 있습니다 말했다

public static T EnsureLoaded<T>(this EntityReference<T> eRef) where T: class, IEntityWithRelationships 
{ 
    if (!eRef.IsLoaded) 
     eRef.Load(); 

    return eRef.Value; 
} 

을 그런 다음 연락처를 사용자 개체가 가정, 당신은 할 수 :

Contact c = User.ContactReference.EnsureLoaded(); 

아직도 꽤 짜증나지만 IsLoaded if 문을 반복 작성하는 것이 더 좋습니다.

+0

Proviste의 답변도 참조하십시오. –

1

정상적으로 예상됩니다. 성능 최적화가 어렵습니다. 안타깝게도, Include 문은 IsLoaded와 Load가 나중에 객체가로드되었는지 확인하기 위해 호출되어야합니다.

1

내가 1-N 관계에 대한 솔루션을 tclem 드리고 있습니다 :

public static EntityCollection<T> EnsureLoaded<T>(this EntityCollection<T> eRef) where T : class, IEntityWithRelationships 
{ 
    if (!eRef.IsLoaded) 
     eRef.Load(); 

    return eRef; 
} 
관련 문제