web-dev-qa-db-fra.com

Quel (s) effet (s) le mot clé virtuel peut-il avoir dans Entity Framework 4.1 POCO Code First?

Le mot clé virtual a-t-il un effet lorsqu'il est utilisé dans les propriétés de EF Code First ?. Quelqu'un peut-il décrire toutes ses ramifications dans différentes situations?

Par exemple, je sais qu’il peut contrôler chargement différé - si vous utilisez le mot clé virtual sur une propriété de relation ICollection/un-à-plusieurs, il sera chargé par défaut, alors que si vous quittez le mot-clé virtuel out, il sera chargé.

Quels autres effets le mot clé virtual peut-il avoir dans les entités EF avec POCO?. Dois-je utiliser par défaut virtual sur toutes mes propriétés ou par défaut de ne pas l'utiliser?

219
Scott Stafford

Jusqu'à présent, je connais ces effets.

  • Chargement paresseux : N'importe quel virtual ICollections sera chargé paresseux, sauf indication contraire de votre part.
  • Suivi des modifications plus efficace . Si vous remplissez toutes les conditions suivantes, votre suivi des modifications peut utiliser une méthode plus efficace en connectant vos propriétés virtuelles. Du lien:

    Pour obtenir des proxy de suivi des modifications, la règle de base est que votre classe doit être publique, non abstraite ou non scellée. Votre classe doit également implémenter des getters/setters virtuels publics pour toutes les propriétés persistantes. Enfin, vous devez déclarer les propriétés de navigation de relation basées sur une collection uniquement comme ICollection<T>. Ils ne peuvent pas être une implémentation concrète ou une autre interface dérivée de ICollection<T> (une différence avec le proxy de chargement différé)

Un autre lien utile décrivant ceci est MSDN Conditions requises pour la création de procurations POCO .

187
Scott Stafford

Ce mot clé virtuel est lié au sujet du chargement de données à partir du cadre de l'entité (chargement différé, chargement rapide et chargement explicite).

Vous devez utiliser le mot-clé virtual , lorsque vous souhaitez charger des données avec un chargement différé.

chargement paresseux est le processus par lequel une entité ou une collection d'entités est automatiquement chargée à partir de la base de données lors de son premier accès.

Par exemple, lors de l'utilisation de la classe d'entité Blog définie ci-dessous, les publications associées seront chargées lors du premier accès à la propriété de navigation Publications:

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

Le chargement paresseux de la collection Posts peut être désactivé en rendant la propriété Posts non virtuelle.

si le chargement différé est désactivé, le chargement de la collection Posts peut toujours être effectué à l'aide du chargement rapide (avec la méthode Include) ou du chargement explicite d'entités associées (avec la méthode Load).

Chargement ardent:

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

Chargement explicite:

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(); 
}
58
Parsa