Entity Framework : 특정 쿼리에 대해 지연로드를 비활성화하는 방법은 무엇입니까?


88

Entity Framework 6에서 특정 쿼리에 대해 지연로드를 비활성화하는 방법이 있습니까? 정기적으로 사용하고 싶지만 때때로 비활성화하고 싶습니다. 가상 속성을 사용하여 지연로드하고 있습니다.


20
set context.Configuration.LazyLoadingEnabled = false; 실행하려는 쿼리 전에
Karthik Ganesan

5
this.Configuration.LazyLoadingEnabled = false;을 설정 한 다음 다시 설정할 수 this.Configuration.LazyLoadingEnabled = true;있습니까? 또한이 msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388

1
@KarthikGanesan 감사합니다. 예상대로 작동했습니다.
Marco Alves

@KarthikGanesan 답변으로 댓글을 달 수 있습니까? 이 : 정말 잘 일하고있어
Sampath

1
응답 @Sampath 등의 코멘트 추가
KARTHIK Ganesan

답변:


76

실행하려는 쿼리 앞에 다음 코드를 설정하십시오.

context.Configuration.LazyLoadingEnabled = false;

40

다음과 같이 특정 쿼리에 대해 지연로드를 비활성화 할 수 있습니다.

public static Cursos GetDatosCursoById(int cursoId)
{
    using (var bd = new AcademyEntities())
    {
        try
        {
            bd.Configuration.ProxyCreationEnabled = false;
            return bd.Cursos.FirstOrDefault(c => c.cursoId == cursoId);
        }
        catch (Exception ex)
        {
            return null;
        }
    }
}

20

여기에 뭔가 빠졌을 수도 있지만 매번 구성을 변경하는 대신 .Include()eager load를 원하는 쿼리에만 사용 하는 또 다른 방법이 있을까요?

Product클래스에 대한 탐색 속성 이있는 클래스 가 있다고 가정 하면 다음 과 같이 Colour로드 할 수 있습니다.ColourProduct

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();

1
저에게는 이것이 최고의 답변입니다!
Ian

포함없이 "제품"을 직접로드하려는 경우에는이 값이 부족합니다.
Mackan

따라서 관련 개체가없는 '제품'또는 '모든 관련 개체가있는 제품'을 원할 것입니다.
Parrybird

1
훨씬 더 유용한 답변입니다. 이는 쿼리가 생성되는 지점에서로드되는 특정 하위 테이블을 제어합니다. 실제 세계의 문제에 대해서는 이것이 갈 길이되어야합니다.
Richard Petheram

5
다른 방식으로 유용합니다. 이렇게하면 '제품'에서 다른 컬렉션에 대해 지연로드가 발생할 수 있습니다. 실제로 지연로드를 비활성화하면 필요한 모든 데이터를 미리 가져오고 숨겨진 성능 병목 현상을 방지하는 데 더 효과적입니다.
Doug

15

다이어그램 속성으로 이동하여 지연로드로 지정된 속성을 찾아 비활성화합니다.

먼저 코드를 사용하는 경우 구성 영역으로 이동하여 다음을 사용하여 비활성화하십시오.

this.Configuration.LazyLoadingEnabled = false;

6
많은 사람들이이 질문을 방문하고 있습니다. 사람들은 실행 계획을 보지 않고 질문을 작성하지 않습니다. 코드가 데이터베이스로 보내는 내용을 항상 파악하십시오. 그렇지 않으면 성능 문제가 발생합니다. linq pad 또는 기타 도구를 사용하여 실제 쿼리를보고 확인할 수 있습니다.
Juan


3

다른 EF 버전에 대한 또 다른 approcah (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 

context이며 ObjectContext, 그 래퍼의 다소되지 전임자를 DbContext.
Gert Arnold

2

다음이 있다고 가정합니다.

IOrderedQueryable<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite);
}

not to라는 명시적인 설정에도 불구하고 여전히 지연 로딩이 발생합니다. 수정은 쉽습니다. 다음과 같이 변경하십시오.

List<Private.Database.DailyItem> items;
using (var context = new Private.Database.PrivateDb())
{
    // context.Configuration.LazyLoadingEnabled = false;
    items = context.DailyItem.OrderBy(c => c.sortOrder).OrderByDescending(c => c.isFavorite).ToList();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.