query net lazyloadingenabled lazy framework async c# entity-framework entity-framework-6

c# - net - lazy load entity framework core



Carga perezosa vs carga ansiosa (7)

La carga diferida en Entity Framework es el fenómeno predeterminado que ocurre al cargar y acceder a las entidades relacionadas. Sin embargo, la carga ansiosa se refiere a la práctica de cargar a la fuerza todas estas relaciones. Me he encontrado con la pregunta de en qué situación la carga ansiosa podría ser más beneficiosa que la carga perezosa. Preguntando esto, porque es obvio que la carga diferida es más amigable con los recursos, e incluso si usamos el método ToList() , aún podemos aprovechar el comportamiento de carga diferida. Sin embargo, pensé que tal vez la carga diferida aumenta el número de solicitudes a la base de datos real y tal vez por eso a veces los desarrolladores usan el método Inlcude para forzar la carga de todas las relaciones. Por ejemplo, cuando se usa el andamiaje automático de Visual Studio en MVC 5, el método Index que se crea automáticamente en el controlador siempre usa Eager Loading, y siempre tuve la pregunta de por qué Microsoft usa Eager Loading de manera predeterminada en ese caso.

Agradecería que alguien me explique en qué situación la carga ansiosa sería más beneficiosa que la carga diferida, y por qué la usamos mientras hay algo más amigable con los recursos como Carga diferida.


Considere la siguiente situación

public class Person{ public String Name{get; set;} public String Email {get; set;} public virtual Employer employer {get; set;} } public List<EF.Person> GetPerson(){ using(EF.DbEntities db = new EF.DbEntities()){ return db.Person.ToList(); } }

Ahora, después de invocar este método, ya no puede cargar de forma diferida la entidad Employer . ¿Por qué? porque el objeto db está dispuesto. Entonces debe hacer Person.Include(x=> x.employer) para forzar que se cargue.


Creo que es bueno categorizar relaciones como esta

Cuando usar carga ansiosa

  1. En "un lado" de las relaciones de uno a muchos que seguro se utilizan en todas partes con la entidad principal. como propiedad del usuario de un artículo. Categoría de propiedad de un Producto.
  2. En general, cuando las relaciones no son demasiado y la carga ansiosa será una buena práctica para reducir más consultas en el servidor.

Cuando usar carga perezosa

  1. Casi en cada "lado de la colección" de las relaciones uno a muchos. como artículos de usuario o productos de una categoría
  2. Usted sabe exactamente que no necesitará una propiedad al instante.

Nota: como Transcendent dijo que puede haber un problema de eliminación con la carga diferida.


Es mejor utilizar la carga ansiosa cuando sea posible, ya que optimiza el rendimiento de su aplicación.

ex-:

Eager loading var customers= _context.customers.Include(c=> c.membershipType).Tolist(); lazy loading

En el modelo, el cliente tiene que definir

Public virtual string membershipType {get; set;}

Entonces, cuando se consulta la carga diferida, es mucho más lento cargar todos los objetos de referencia, pero se carga la consulta y se selecciona solo el objeto que sea relevante.


La carga diferida producirá varias llamadas SQL, mientras que la carga ansiosa puede cargar datos con una llamada "más pesada" (con uniones / subconsultas).

Por ejemplo, si hay un ping alto entre sus servidores web y sql, optará por cargar Eager en lugar de cargar elementos relacionados 1 por 1 con carga diferida.


Carga ansiosa Cuando esté seguro de que desea obtener varias entidades a la vez, por ejemplo, debe mostrar el usuario y los detalles del usuario en la misma página, entonces debe ir con carga ansiosa. La carga ansiosa hace un solo golpe en la base de datos y carga las entidades relacionadas.

Carga diferida Cuando tiene que mostrar a los usuarios solo en la página, y al hacer clic en los usuarios, necesita mostrar los detalles del usuario, debe ir con la carga diferida. La carga diferida realiza múltiples visitas para cargar las entidades relacionadas cuando vincula / itera entidades relacionadas.


Eager Loading: Eager Loading te ayuda a cargar todas tus entidades necesarias a la vez. es decir, los objetos relacionados (objetos secundarios) se cargan automáticamente con su objeto principal.

Cuándo usar:

  1. Use Eager Loading cuando las relaciones no sean demasiado. Por lo tanto, Eager Loading es una buena práctica para reducir más consultas en el servidor.
  2. Use Eager Loading cuando esté seguro de que usará entidades relacionadas con la entidad principal en todas partes.

Carga diferida : en caso de carga diferida, los objetos relacionados (objetos secundarios) no se cargan automáticamente con su objeto principal hasta que se solicitan. Por defecto, LINQ admite la carga diferida.

Cuándo usar:

  1. Use Carga diferida cuando use colecciones de uno a muchos.
  2. Use Carga diferida cuando esté seguro de que no está utilizando entidades relacionadas al instante.

NOTA: Entity Framework admite tres formas de cargar datos relacionados: carga ansiosa, carga diferida y carga explícita.


// Using LINQ and just referencing p.Employer will lazy load // I am not at a computer but I know I have lazy loaded in one // query with a single query call like below. List<Person> persons = new List<Person>(); using(MyDbContext dbContext = new MyDbContext()) { persons = ( from p in dbcontext.Persons select new Person{ Name = p.Name, Email = p.Email, Employer = p.Employer }).ToList(); }