related query objects not lazy framework c# entity-framework entity-framework-4 ef-code-first lazy-loading

c# - objects - entity framework sql query



Código de Entity Framework First Lazy Loading (2)

Esto está mal

La palabra clave "virtual" se usa para no cargar las entidades a menos que usted lo explique (usando una declaración "Include")

La carga diferida significa que las entidades se cargarán automáticamente cuando acceda por primera vez a la propiedad de recopilación o navegación, y eso ocurrirá de forma transparente, como si siempre estuvieran cargadas con un objeto principal.

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

La existencia de palabra clave virtual está relacionada solo con la carga diferida. virtual palabra clave virtual permite el tiempo de ejecución del marco de la entidad crear proxies dinámicos para sus clases de entidad y sus propiedades, y por ese apoyo 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.

Estoy teniendo dos clases de objetos

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 usando dataContext, obtengo la lista de productos que son nulos (esto está bien).

Si agrego una palabra clave "virtual" a la lista de Productos,

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

cuando cargo al usuario, también obtengo la lista de Productos.

¿Por qué está pasando esto? Pensé que la palabra clave "virtual" se usa para no cargar las entidades a menos que lo expliques explícitamente (usando una declaración "Include")

Creo que lo entendí todo mal


Supongo que está solicitando una propiedad que es un tema de carga diferida mientras se encuentra en el contexto de ef:

using (var db = new Context()) { var user = db.Users.Where(...); var products = user.Products; // being loaded right away }

Intenta dejarlo:

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?