Entity Framework 4.1 Propriétés Virtuelles
Si j'ai déclaré entité-relation dans mon modèle virtuel, il n'est pas nécessaire d'utiliser le Include
déclaration dans ma requête LINQ, non ??-
Pour les ex: C'est mon modèle de classe :
public class Brand
{
public int BrandID { get; set; }
public string BrandName { get; set; }
public string BrandDesc { get; set; }
public string BrandUrl { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Maintenant, pour le modèle ci-dessus classe, je n'ai pas besoin d'utiliser le var brandsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22);
.
Au lieu de cela, je peux utiliser le simple var brandsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22);
et j'ai automatiquement l'entité liée disponibles lors de l'accès.
Ai-je raison de ma compréhension ?
Aussi, veuillez me dire dans quelles situations je préférerais l'un sur l'autre ??
Vous devez vous connecter pour publier un commentaire.
Vous sont corrects, mais la règle est plus complexe à faire fonctionner vraiment comme prévu. Si vous définissez votre navigation propriété
virtual
EF à l'exécution de créer une nouvelle classe (dynamic proxy) provenant de votreBrand
classe et de l'utiliser à la place. Ce nouveau créé dynamiquement classe contient la logique de charger une propriété de navigation lorsque vous accédez pour la première fois. Cette fonction est appelée au chargement différé (ou mieux transparente lazy loading).Quelles règles doivent être rencontrer pour faire ce travail:
virtual
context.Configuration.ProxyCreationEnabled
). Il est activé par défaut.context.Configuration.LazyLoadingEnabled
). Il est activé par défaut.À l'opposé de lazy loading est appelé impatient de chargement et c'est ce que
Include
n'. Si vous utilisezInclude
votre propriété de navigation est chargé avec de l'entité.Utilisation de chargement paresseux et désireux de chargement dépend de vos besoins et également sur les performances.
Include
charge toutes les données dans une seule requête de base de données, mais il peut entraîner vaste ensemble de données lors de l'utilisation de beaucoup de ou le chargement d'un grand nombre d'objets. Si vous êtes sûr que vous aurez besoinBrand
et tous lesProducts
pour le traitement, vous devez utiliser désireux de chargement.Lazy loading est à son tour utilisé si vous n'êtes pas sûr de la propriété de navigation dont vous aurez besoin. Par exemple, si vous chargez 100 marques, mais vous aurez besoin d'accéder uniquement à des produits d'une marque, il n'est pas nécessaire de charger des produits pour toutes les marques dans la requête initiale. L'inconvénient de le lazy loading est séparé de requête de données (aller-retour) pour chaque propriété de navigation => si vous chargez 100 marques sans inclure et vous pourrez accéder à
Products
propriété dans chaqueBrand
exemple votre code va générer un autre 100 requêtes pour remplir ces propriétés de navigation = désireux de chargement utiliserait qu'simple requête, mais le chargement paresseux utilisé 101 requêtes (il est appelé N + 1 problème).Dans des scénarios plus complexes, vous pouvez trouver qu'aucune de ces stratégies fonctionnent comme vous le souhaitez et vous pouvez utiliser soit le troisième stratégie explicite de chargement ou de séparer les requêtes de la charge de marques et de produits pour toutes les marques dont vous avez besoin.
Chargement explicite a les mêmes inconvénients que le chargement paresseux, mais vous devez déclencher manuellement:
Les principaux avantages pour le chargement explicite est la capacité de filtre de rapport. Vous pouvez utiliser
Query()
avantLoad()
et l'utilisation de tout filtrage ou même désireux de chargement de relations imbriquées.