Entity Framework: como desabilitar o carregamento lento para uma consulta específica?

88

Existe alguma maneira de desativar o carregamento lento para uma consulta específica no Entity Framework 6? Quero usá-lo regularmente, mas às vezes quero desativá-lo. Estou usando propriedades virtuais para carregá-los lentamente.

Marco Alves
fonte
20
definir context.Configuration.LazyLoadingEnabled = false; antes da consulta que você deseja executar
Karthik Ganesan
5
Você poderia apenas definir o valor e this.Configuration.LazyLoadingEnabled = false;, em seguida, defini-lo novamente this.Configuration.LazyLoadingEnabled = true;? Além disso, você pode ler este msdn.microsoft.com/en-us/data/jj574232.aspx
user1477388
1
obrigado @KarthikGanesan. Funcionou como esperado.
Marco Alves
@KarthikGanesan Você pode colocar seu comentário como uma resposta? Está funcionando muito bem :)
Sampath
1
Adicionado o comentário como resposta @Sampath
Karthik Ganesan

Respostas:

76

defina o seguinte código antes da consulta que deseja executar

context.Configuration.LazyLoadingEnabled = false;
Karthik Ganesan
fonte
40

Você pode desativar o carregamento lento para consultas específicas da seguinte maneira:

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;
        }
    }
}
William Ballesteros
fonte
20

Posso estar faltando alguma coisa aqui, mas em vez de alterar a configuração toda vez, outra abordagem seria usar .Include()apenas nas consultas em que você deseja carregar antecipadamente?

Suponha que temos uma Productclasse que tem uma propriedade de navegação para uma Colourclasse, você pode carregar o Colourpara um Productassim -

var product = _context.Products
    .Where(p => p.Name == "Thingy")
        .Include(x => x.Colours)
        .ToList();
Parrybird
fonte
1
Para mim, esta é a melhor resposta aqui!
Ian
Isso é insuficiente se você deseja apenas carregar rapidamente "produtos", sem quaisquer inclusões.
Mackan
Então, você deseja obter 'Produtos' sem nenhum de seus objetos relacionados ou 'Produtos com todos os objetos relacionados?'
Parrybird 01 de
1
Resposta muito mais útil. Isso controla as tabelas subordinadas específicas que são carregadas no ponto onde a consulta está sendo construída. Para qualquer problema do mundo real, esse deve ser o caminho a seguir.
Richard Petheram
5
É útil de uma maneira diferente ... se você fizer dessa forma, ainda será possível obter um carregamento lento para outra coleção de 'Produtos'. Na verdade, desabilitar o carregamento lento é mais eficaz para garantir que todos os dados necessários sejam buscados com antecedência e evita a criação de gargalos de desempenho ocultos.
Doug,
15

Vá para as propriedades do seu diagrama e encontre uma propriedade designada para carregamento lento e desative-o.

Se você estiver usando o código primeiro, vá para a área de configuração e desative-o com:

this.Configuration.LazyLoadingEnabled = false;
Juan
fonte
6
Muitas pessoas estão visitando esta pergunta e eu quero dizer, as pessoas NÃO ESCREVEM AS CONSULTAS SEM VERIFICAR O PLANO DE EXECUÇÃO. Sempre saiba o que seu código envia para o banco de dados ou você terá problemas de desempenho. Você pode usar o linq pad ou outras ferramentas para visualizar a consulta real e verificar.
Juan
11

No EF Core: context.ChangeTracker.LazyLoadingEnabled = false;

Por esta resposta .

Matt Jenkins
fonte
3

Outra aprovação para outra versão EF (Entity Framework 5)

//Note: ContextOptions instead of ChangeTracker or Configuration
context.ContextOptions.LazyLoadingEnabled = false; 
fubo
fonte
Quando contexté um ObjectContext, o predecessor mais ou menos obsoleto de seu wrapper DbContext,.
Gert Arnold
2

Suponha que você tenha este:

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);
}

Você ainda obteria carregamento lento, apesar da configuração explícita de não. A correção é fácil, mude para isto:

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();
}
Fortaleza
fonte