2011-04-08 26 views
198

¿La palabra clave virtual tiene un efecto cuando se usa en las propiedades en EF Code First ?. ¿Puede alguien describir todas sus ramificaciones en diferentes situaciones?¿Qué efecto (s) puede tener la palabra clave virtual en Entity Framework 4.1 POCO Code First?

Por ejemplo, sé que puede controlar lazy loading - si utiliza la palabra clave virtual en una propiedad de relación ICollection/uno-a-muchos, se cargará de forma diferida por defecto, mientras que si deja la palabra clave virtual , estará ansiosamente cargada.

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

Respuesta

172

Hasta ahora, conozco estos efectos.

  • Lazy Loading: Cualquier virtual ICollections serán lazy-cargado a menos que los marca específicamente lo contrario.
  • More efficient change tracking. Si cumple con todos los requisitos siguientes, su seguimiento de cambios puede utilizar un método más eficiente enganchando 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 sellado. Su clase también debe implementar getters/setters públicos para todas las propiedades que se conservan. Finalmente, debe declarar la colección basada en las propiedades de navegación de relaciones como ICollection<T> solamente. no pueden ser un aplicación concreta u otra interfaz de que se deriva de ICollection<T> (una diferencia de la diferido Cargando de proxy)

Otro vínculo útil describir esto es MSDN de Requirements for Creating POCO Proxies.

+49

No hay ninguna otra razón para hacer las propiedades virtual. Las propiedades de navegación se marcan como virtuales para la carga diferida y las propiedades escalares se marcan como virtuales para el seguimiento de cambios. –

+6

¿Qué son las propiedades de navegación y cuáles son las propiedades escalares? –

+7

@AbidAli: Creo que una propiedad de navegación es una clave externa (un tipo de clase de entidad) o una relación de uno a muchos (de tipo ICollection <>). Una propiedad escalar es un tipo base (int, string, ..) o ComplexType (que es solo una estructura de tipos base). –

46

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

que puedes usar virtuales palabra clave, cuando se desea cargar datos con carga diferida.

lazy loading 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 Blog entidad se define a continuación, los mensajes relacionados se cargará la primera vez que se accede a la propiedad de navegación Mensajes:

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; } 
} 

carga Lazy de la colección de Mensajes se puede apagar por haciendo que la propiedad de Publicaciones no sea virtual.

si la carga diferida está desactivada, la carga de la recopilación de publicaciones aún se puede lograr usando la carga ansiosa (usando el método Incluir) o cargando entidades relacionadas (utilizando el método Load).

impaciencia Carga:

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

explícitamente Carga:

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(); 
} 
+1

Cómo evitar el problema de N + 1 cuando se usa virtual (carga lenta)? Por ejemplo, context.Blogs.ToList(); luego no unirá las tablas, y ejecutará la consulta de selección tanto como el número de blogs. –

Cuestiones relacionadas