framework entity-framework-4 ef-code-first entity-framework-4.1

entity-framework-4 - public virtual icollection entity framework



¿Qué efecto(s) puede tener la palabra clave virtual en Entity Framework 4.1 POCO Code First? (2)

Esta palabra clave virtual está relacionada con el tema de la carga de datos desde el marco de la entidad (carga perezosa, carga impaciente y carga explícita).

Debe usar una palabra clave virtual cuando desee cargar datos con una carga lenta.

la carga diferida es el proceso mediante el cual una entidad o colección de entidades se carga automáticamente desde la base de datos la primera vez que se accede.

Por ejemplo, cuando se utiliza la clase de entidad de blog definida a continuación, las publicaciones relacionadas se cargarán la primera vez que se acceda a la propiedad de navegación de publicaciones:

public class Blog { public int BlogId { get; set; } public string Name { get; set; } public string Url { get; set; } public string Tags { get; set; } public virtual ICollection<Post> Posts { get; set; } }

La carga lenta de la colección de publicaciones se puede desactivar haciendo que la propiedad de publicaciones no sea virtual.

si la carga diferida está desactivada, la carga de la colección de Publicaciones aún se puede lograr usando una carga impaciente (utilizando el método Incluir) o cargando explícitamente las entidades relacionadas (utilizando el método Cargar).

Carga impaciente:

using (var context = new BloggingContext()) { // Load all blogs and related posts var blogs1 = context.Blogs .Include(b => b.Posts) .ToList(); }

Carga explícita:

using (var context = new BloggingContext()) { var blog = context.Blogs.Find(1); // Load the posts related to a given blog context.Entry(blog).Collection(p => p.Posts).Load(); }

¿Tiene la palabra clave virtual un efecto cuando se usa en las propiedades en EF Code First? ¿Puede alguien describir todas sus ramificaciones en diferentes situaciones?

Por ejemplo, sé que puede controlar la carga lenta : si utiliza la palabra clave virtual en una propiedad de relación ICollection / one-to-many, se cargará de forma predeterminada de forma predeterminada, mientras que si deja la palabra clave virtual fuera, estar cargado de ganas.

¿Qué otros efectos puede tener la palabra clave virtual en EF con las entidades POCO? ¿Debo hacer que sea predeterminado usar virtual en todas mis propiedades o predeterminado para no usarlo?


Hasta ahora, sé de estos efectos.

  • Carga diferida: cualquier ICollections virtual cargará de forma perezosa a menos que específicamente las marque.
  • Seguimiento de cambios más eficiente . Si cumple con todos los requisitos siguientes, su seguimiento de cambios puede utilizar un método más eficiente al enganchar sus propiedades virtuales. Desde el enlace:

    Para obtener proxies de seguimiento de cambios, la regla básica es que su clase debe ser pública, no abstracta o no sellada. Su clase también debe implementar getters / setters virtuales públicos para todas las propiedades que se conservan. Finalmente, debe declarar las propiedades de navegación de relaciones basadas en la colección como ICollection<T> solamente. No pueden ser una implementación concreta u otra interfaz que se derive de ICollection<T> (una diferencia del proxy de carga diferida)

Otro enlace útil que describe esto es los Requisitos de MSDN para Crear Proxies de POCO .