La carga diferida en Entity Framework es el fenómeno predeterminado que ocurre para cargar y acceder a las entidades relacionadas. Sin embargo, la carga ansiosa se refiere a la práctica de forzar 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 diferida. Preguntando esto, porque es obvio que la carga diferida es más amigable con los recursos, e incluso si usamos elToList()
método, aún podemos aprovechar el comportamiento de carga diferida. Sin embargo, pensé que tal vez la carga diferida aumenta la cantidad de solicitudes a la base de datos real y tal vez es por eso que a veces los desarrolladores usan elInlcude
método para forzar la carga de todas las relaciones. Por ejemplo, cuando se usa el andamio 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 me he preguntado por qué Microsoft usa Eager Loading de forma predeterminada en ese caso.
Agradecería que alguien me explicara 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 la carga diferida.
fuente
Respuestas:
Creo que es bueno categorizar relaciones como esta
Cuando usar la carga ansiosa
Cuando usar la carga diferida
Nota: como dijo Transcendent, puede haber un problema de eliminación con la carga diferida.
fuente
Carga ansiosa: Carga ansiosa lo ayuda a cargar todas las entidades necesarias a la vez. es decir, los objetos relacionados (objetos secundarios) se cargan automáticamente con su objeto principal.
Cuándo usar:
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. De forma predeterminada, LINQ admite la carga diferida.
Cuándo usar:
fuente
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 su web y los servidores SQL, optaría por la carga ansiosa en lugar de cargar elementos relacionados 1 por 1 con carga diferida.
fuente
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 llamar a este método, ya no puede cargar la
Employer
entidad de forma diferida . ¿Por qué? porque eldb
objeto está desechado. Entonces tienes que hacerPerson.Include(x=> x.employer)
para forzar que se cargue.fuente
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 la 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, debe mostrar los detalles del usuario, debe utilizar la carga diferida. La carga diferida genera múltiples visitas para cargar las entidades relacionadas cuando enlaza / itera entidades relacionadas.
fuente
Carga diferida : es bueno cuando se maneja con paginación, como en la carga de la página, aparece una lista de usuarios que contiene 10 usuarios y, a medida que el usuario se desplaza hacia abajo en la página, una llamada de API trae los siguientes 10 usuarios. Es bueno cuando no desea cargar datos completos en una vez, ya que llevaría más tiempo y daría una mala experiencia al usuario.
Carga ansiosa : es bueno como sugirieron otras personas cuando no hay muchas relaciones y obtienen datos completos de una sola vez en una sola llamada a la base de datos
fuente
Es mejor utilizar la carga ansiosa cuando sea posible, porque 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 debe definir
Public virtual string membershipType {get; set;}
Entonces, cuando se consulta la carga diferida, la carga de todos los objetos de referencia es mucho más lenta, pero la carga ansiosa de la consulta y selecciona solo el objeto que es relevante.
fuente
// 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(); }
fuente
Lazy loading
, pregunta sobre "cuándoLazy loading
y cuándo usarloEager Loading
"