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é sur les propriétés du code EF en premier? Quelqu’un peut-il décrire toutes ses ramifications dans différentes situations?

Par exemple, je sais qu’il peut contrôler le chargement paresseux – si vous utilisez le mot-clé virtuel sur une propriété de relation ICollection / one-to-many, il sera par défaut chargé, alors que si vous laissez le mot-clé virtuel, il sera être chargé avec impatience.

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

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

    • Lazy Loading : Tous virtual ICollections virtual seront chargés à moins que vous ne les marquiez spécifiquement.
    • Suivi des modifications plus efficace . Si vous remplissez toutes les conditions suivantes, votre suivi des modifications peut utiliser une méthode plus efficace en accrochant vos propriétés virtuelles. À partir du lien:

      Pour obtenir des proxies 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 des collections uniquement sous la forme ICollection . Ils ne peuvent pas être une implémentation concrète ou une autre interface dérivant d’ ICollection (une différence par rapport au proxy de chargement différé)

    Un autre lien utile décrivant cela est la configuration requirejse par MSDN pour la création de proxy POCO .

    Ce mot-clé virtuel est lié au sujet du chargement de données à partir d’une structure d’entité (chargement différé, chargement rapide et chargement explicite).

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

    le chargement différé est le processus par lequel une entité ou un ensemble d’entités est automatiquement chargé à partir de la firebase database lors de son premier access.

    Par exemple, lorsque vous utilisez la classe d’entité Blog définie ci-dessous, les Posts associés seront chargés la première fois que la propriété de navigation Posts est accédée:

     public class Blog { public int BlogId { get; set; } public ssortingng Name { get; set; } public ssortingng Url { get; set; } public ssortingng Tags { get; set; } public virtual ICollection Posts { get; set; } } 

    Le chargement différé 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 des messages peut toujours être effectué en utilisant un chargement rapide (en utilisant la méthode Include) ou en chargeant explicitement des entités associées (en utilisant la méthode Load).

    Avec impatience

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