26

que estoy teniendo dos clases de objetosentidad Código Marco Primera Lazy Loading

public class User 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 

    // Navigation 
    public ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public Guid Id { get; set; } 

    // Navigation 
    public User User { get; set; } 
    public Guid User_Id { get; set; } 

    public string Name { get; set; } 
} 

Cuando cargo un usuario que utiliza DataContext, me da la lista de los productos que están siendo nula (esto es normal).

si añado la palabra clave "virtual" a la lista de los productos,

public virtual ICollection<Product> Products { get; set; } 

cuando cargo al usuario, tengo la lista de los productos también.

¿Por qué sucede esto? Pensé que "virtual" palabra clave se utiliza para no cargar las entidades A menos que explícitamente esto (utilizando un "include" declaración)

Creo que lo tengo todo mal

+1

puede usar context.ContextOptions.LazyLoadingEnabled = false; forzar al contexto a no usar LazyLoading –

+0

Con dbContext, sería context.Configuration.LazyLoadingEnabled = false; – VivekDev

Respuesta

55

Esto está mal

"virtual" palabra clave se utiliza para no cargar las entidades a menos que explícita esto (utilizando un "include" declaración)

Lazy Loading significa que las entidades serán cargados automáticamente cuando primero accede a la propiedad de recopilación o navegación, y eso ocurrirá de forma transparente, como si siempre estuvieran cargados con el objeto principal.

El uso de "incluir" se carga a pedido, cuando especifica las propiedades que desea consultar.

La existencia de la palabra clave virtual está relacionada solo con la carga diferida. La palabra clave virtual permite a entity framework runtime crear proxys dinámicos para sus clases de entidad y sus propiedades, y mediante ese soporte la carga diferida. Sin virtual, no se admitirá la carga diferida, y obtendrá nulo en las propiedades de la colección.

El hecho es que puede usar "incluir" en cualquier caso, pero sin carga lenta es la única forma de acceder a las propiedades de colección y navegación.

+0

_ "Lazy La carga significa que las entidades se cargarán automáticamente cuando acceda por primera vez a la colección" _ Esto significa que si nunca accederé a la propiedad user.Products, los productos no se cargarán, ¿verdad? – Catalin

+0

@RaraituL: derecha – abatishchev

+5

@RaraituL sí, eso es correcto.Al depurar, en realidad tiene ** acceso ** a las propiedades y se cargan si se admite la carga diferida. Por lo tanto, podría usar el generador de perfiles sql o herramientas similares para depurar las consultas reales enviadas a la base de datos. – archil

4

supongo que estés Quiring una propiedad que es un tema para la carga perezosa mientras que ser en el contexto EF:

using (var db = new Context()) 
{ 
    var user = db.Users.Where(...); 

    var products = user.Products; // being loaded right away 
} 

tratar de salir de ella:

User user; 
using (var db = new Context()) 
{ 
    user = db.Users.Where(...); 

    // I guess you will need here: 
    // .Include(u => u.Products) 
} 
var products = user.Products; // what error will you get here? 
+0

sin usar "virtual": usuario user = db.Users.First(); en modo de depuración, user.Products es nulo. usando palabra clave "virtual": Usuario user = db.Users.First(); en modo de depuración, user.Products es una lista de productos – Catalin

+0

@RaraituL: como ya ha mencionado archil, debe usar palabras clave virtuales en el enfoque Code First para posibilitar la carga diferida. Entonces puedes activarlo o desactivarlo. – abatishchev

+0

Pero el contexto estaba "cerrado" antes de "user.Products", entonces ¿cómo funcionará la carga lenta si hay contexto? – Nerf

Cuestiones relacionadas