Existe-t-il un moyen de décorer vos classes POCO pour charger automatiquement les entités enfants sans avoir à utiliser Include()
à chaque fois que vous les chargez ?
Disons que j'ai une classe Car, avec des propriétés de type complexe pour les roues, les portes, le moteur, le pare-chocs, les fenêtres, l'échappement, etc. Et dans mon application, je dois charger ma voiture depuis mon DbContext à 20 endroits différents avec différentes requêtes, etc. Je ne veux pas avoir à spécifier que je veux inclure toutes les propriétés à chaque fois que je veux charger ma voiture.
Je veux dire
List cars = db.Car
.Where(x => c.Make == "Ford").ToList();
//PAS .Include(x => x.Wheels).Include(x => x.Doors).Include(x => x.Engine).Include(x => x.Bumper).Include(x => x.Windows)
foreach(Car car in cars)
{
//Je ne veux pas de référence nulle ici.
String myString = car.**Bumper**.Titre;
}
Puis-je d'une manière ou d'une autre décorer ma classe POCO ou dans mon OnModelCreating()
ou définir une configuration dans EF qui lui indiquera de simplement charger toutes les parties de ma voiture lorsque je charge ma voiture ? Je veux faire cela en mode eager, donc à mon avis, rendre mes propriétés de navigation virtuelles est exclu. Je sais que NHibernate prend en charge une fonctionnalité similaire.
Je me demande juste si j'ai raté quelque chose. Merci d'avance !
Amicalement,
Nathan
J'aime la solution ci-dessous, mais je me demande si je peux imbriquer les appels aux méthodes d'extension. Par exemple, disons que j'ai une situation similaire avec Engine où il a de nombreuses pièces que je ne veux pas inclure partout. Puis-je faire quelque chose comme ça ? (Je n'ai pas encore trouvé de moyen pour que cela fonctionne). De cette manière, si plus tard je découvre que Engine a besoin d'Injecteurs de carburant, je peux l'ajouter uniquement dans BuildEngine et ne pas avoir à l'ajouter également dans BuildCar. Aussi, si je peux imbriquer les appels, comment puis-je imbriquer un appel à une collection? Comme appeler BuildWheel() pour chacune de mes roues depuis mon BuildCar()?
public static IQueryable BuildCar(this IQueryable query) {
return query.Include(x => x.Wheels).BuildWheel()
.Include(x => x.Doors)
.Include(x => x.Engine).BuildEngine()
.Include(x => x.Bumper)
.Include(x => x.Windows);
}
public static IQueryable BuildEngine(this IQueryable query) {
return query.Include(x => x.Pistons)
.Include(x => x.Cylinders);
}
//Ou pour gérer une collection par exemple.
public static IQueryable BuildWheel(this IQueryable query) {
return query.Include(x => x.Rim)
.Include(x => x.Tire);
}
Voici un autre fil de discussion très similaire au cas où cela serait utile à quelqu'un d'autre dans cette situation, mais cela ne gère toujours pas la possibilité de faire des appels imbriqués aux méthodes d'extension.
Entity framework linq query Include() multiple children entities