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


¿La palabra clave virtual tiene un efecto cuando se usa primero en las propiedades del Código EF?. ¿Puede alguien describir todas sus ramificaciones en diferentes situaciones?

Por ejemplo, sé que puede controlar lazy loading if si usa la palabra clave virtual en una propiedad de relación ICollection/one-to-many, será lazy-loaded por defecto, mientras que si deja la palabra clave virtual fuera, será eager-loaded.

Qué otros efectos puede tener la palabra clave virtual en EF con POCO las entidades?. ¿Debo hacer que por defecto use virtual en todas mis propiedades, o por defecto no usarlo?

Author: Sorangwala Abbasali, 2011-04-08

2 answers

Hasta ahora, sé de estos efectos.

  • Lazy Loading: Cualquier virtual ICollections será lazy-loaded a menos que las marque específicamente de otra manera.
  • Seguimiento de cambios más eficiente. Si cumple con todos los requisitos siguientes, su seguimiento de cambios puede usar un método más eficiente al conectar sus propiedades virtuales. Desde el enlace:

    Para obtener proxies de seguimiento de cambios, el la regla básica es que tu clase debe ser publico, no abstracta o no sellada. Su clase también debe implementar público getters virtuales/setters para todos propiedades que se conservan. Finalmente, debe declarar la colección navegación basada en relaciones propiedades como ICollection<T> solamente. No pueden ser un concreto implementación u otra interfaz que se deriva de ICollection<T> (a diferencia con respecto a la Carga Diferida proxy)

Otro enlace útil que describe esto son los requisitos de MSDN para crear POCO Proxies .

 181
Author: Scott Stafford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-10 03:39:28

Esta palabra clave virtual está relacionada con el tema de cargar datos desde entity framework (carga perezosa, carga ansiosa y carga explícita).

Debe usar virtual palabra clave, cuando 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 a ella.

Por ejemplo, cuando se utiliza la clase de entidad Blog definida a continuación, la los mensajes relacionados se cargarán la primera vez que se acceda a la propiedad de navegación de 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; }  
}

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

Si la carga perezosa está desactivada, la carga de la colección de mensajes aún se puede lograr utilizando la carga ansiosa (utilizando el método Include) o cargando explícitamente entidades relacionadas (utilizando el método Load).

Cargando ansiosamente:

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(); 
}
 52
Author: Parsa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-16 21:07:30