1
resposta

Como evitar carregamento em vários níveis

Prezados,

tenho uma estrutura aqui em EF Core 5 com o seguinte cenário:

public class Book { public int Id {get;set;} public string Title {get;set;} public virtual Author {get;set;} }

public class Author { public int Id {get;set;} public string Name {get;set;} public int Age {get;set;} public ICollection Books {get;set;} }

Feita a montagem da estrutura estou usando carregamento explicito... e me deparando com a seguinte situação:

Ao carregar Autor, faço o carregamento dos livros... Collection(...).Load();

Ao carregar o Livro, faço o carregamento do autor... Reference(...).Load();

Ele está carregando o livro, seu autor, porém o mesmo livro é carregado novamente na listagem de livros daquele autor.

Exemplo:

{
    Id: 1,
    Title: "A era do gelo",
    Author: {
        Id:1,
        Name:"John Q.",
        Age:40,
        Books:[
            {
                Id:1,
                Title:"A era do gelo",...
            },...
        ]
}

Como faço para evitar este carregamento desnecessário ? teria como fazer isso estruturalmente ?! visto que existe um repositorio base do qual as demais classes herdam dele.
1 resposta

Olá Alan

Para evitar o carregamento desnecessário dos livros ao carregar o autor e vice-versa, você pode utilizar o recurso de carregamento adiantado (eager loading) do Entity Framework Core. Com o carregamento adiantado, você pode especificar quais propriedades relacionadas devem ser carregadas juntamente com a entidade principal.

No seu caso, você pode utilizar o método Include para carregar os livros juntamente com o autor, e vice-versa. Por exemplo:

var author = dbContext.Authors.Include(a => a.Books).FirstOrDefault(a => a.Id == authorId);

Dessa forma, ao carregar um autor, os livros relacionados serão carregados automaticamente, evitando o carregamento desnecessário posteriormente.

Da mesma forma, ao carregar um livro, você pode utilizar o método Include para carregar o autor:

var book = dbContext.Books.Include(b => b.Author).FirstOrDefault(b => b.Id == bookId);

Assim, o autor relacionado ao livro será carregado juntamente com o livro, evitando o carregamento redundante.

Espero que isso ajude a resolver o seu problema! Se tiver mais alguma dúvida, é só me dizer. Bons estudos!

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software