Quel(S) effet (s) le mot-clé virtuel peut-il avoir dans le cadre D'Entity 4.1 code POCO en premier?

le mot-clé virtual a-t-il un effet lorsqu'il est utilisé en premier sur les propriétés du code EF?. Quelqu'un peut-il décrire toutes ses ramifications dans différentes situations?

par exemple, je sais qu'il peut contrôler lazy loading -- si vous utilisez le mot-clé virtuel sur une propriété ICollection/one-to-many relationship, il sera paresseux-chargé par défaut, alors que si vous laissez le mot-clé virtuel, il sera impatient-chargé.

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

210
demandé sur Sorangwala Abbasali 2011-04-08 20:02:49

2 réponses

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

  • Lazy Loading : toute ICollection virtual sera chargée paresseusement à moins que vous ne l'indiquiez autrement.
  • Plus efficace le suivi des modifications . Si vous rencontrez toutes les exigences suivantes, alors votre suivi de changement peut utiliser une méthode plus efficace en accrochant vos propriétés virtuelles. À partir du lien:

    pour obtenir des proxies de suivi des changements, le règle de base est que votre classe doit être public, abstrait ou non scellées. Votre classe doit également mettre en œuvre virtuel des getters/setters pour tous propriétés qui persistent. Enfin, vous devez déclarer collection navigation fondée sur les relations propriétés comme ICollection<T> seulement. Ils ne peuvent être en béton mise en œuvre ou autre interface qui dérive de ICollection<T> (un différence de la Différés Chargement mandataire)

un autre lien utile décrivant ceci est le Requirements for Creating POCO Proxies de MSDN .

181
répondu Scott Stafford 2011-11-10 03:39:28

ce mot-clé virtuel est lié au thème du chargement de données à partir du framework entity (chargement paresseux, chargement rapide et chargement explicite).

vous devez utiliser virtuel mot-clé, quand vous voulez charger des données avec chargement paresseux.

lazy loading est le processus par lequel une entité ou d'une collection d'entités est automatiquement chargé à partir de la base de données la première fois, il est accéder.

par exemple, si vous utilisez la classe Blog entity définie ci-dessous, les billets associés seront chargés la première fois que la propriété de navigation des billets est consultée:

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

chargement paresseux de la collection de poteaux peut être éteint en faisant la propriété de poteaux non-virtuel.

si le chargement paresseux est désactivé, le chargement de la collection de poteaux peut encore être réalisé en utilisant le chargement eager (en utilisant la méthode Include) ou explicitement le chargement entités apparentées (utilisant la méthode Load).

Chargement 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(); 
}
52
répondu Parsa 2017-03-16 21:07:30