Le mot clé virtuel n'a jamais été OBLIGATOIRE... Il est facultatif.
Qu'est-ce que cela change ?
1. si vous déclarez votre propriété virtuelle :
Votre propriété virtuelle (par défaut) ne sera pas chargée immédiatement lors de l'interrogation de l'objet principal. Elle sera récupérée de la base de données UNIQUEMENT si vous essayez d'y accéder, ou d'accéder à l'un de ses composants.
C'est ce qu'on appelle le chargement paresseux.
2. si vous le déclarez non-virtuel :
Votre propriété sera (par défaut) chargée immédiatement avec toutes les autres propriétés de votre entité principale. Cela signifie que votre propriété sera prête à accéder : elle a déjà été récupérée. L'entité n'aura pas besoin d'interroger à nouveau la base de données parce que vous accédez à cette propriété.
C'est ce qu'on appelle le chargement rapide.
Mon avis :
Le plus souvent, je choisis le chargement rapide (non virtuel) parce que la plupart du temps, j'ai besoin que chaque propriété de chaque entité soit utilisée sans avoir à faire une nouvelle requête (plus rapide dans le cas où vous voulez vraiment que tout soit rapide) mais si vous n'accédez à cette propriété qu'une fois de temps en temps (vous ne listez rien) et que vous voulez plus souvent juste le reste des informations excepté CETTE propriété, alors rendez-la virtuelle pour que cette propriété ne ralentisse pas le reste de la requête juste pour quelques accès.
J'espère que c'était clair...
Exemples :
Où je n'utiliserais PAS le virtuel (Eagerly) :
foreach(var line in query)
{
var v = line.NotVirtual; // I access the property for every line
}
Où j'utiliserais le chargement virtuel ou paresseux :
foreach(var line in query)
{
if(line.ID == 509) // because of this condition
var v = line.Virtual; // I access the property only once in a while
}
une dernière chose :
Si vous n'interrogez pas plus de 1 000 lignes d'une base de données, le choix que vous ferez n'aura pas un grand effet. De plus, vous pouvez déclarer ces propriétés virtuelles et si vous voulez tester l'inverse, il vous suffit de faire ceci (Entity 4.0) :
context.LazyLoadingEnabled = false;
Cela annulera l'effet virtuel.
Modifier
Pour les versions plus récentes de EF :
WhateverEntities db = new WhateverEntities()
db.Configuration.LazyLoadingEnabled = false;