J'écris une application C # qui utilise EF Core pour générer toutes mes relations avec ma base de données. J'essaie actuellement de charger certaines relations uniquement lorsque j'en ai besoin (c'est-à-dire lorsque j'essaie de supprimer des enregistrements).
J'essaie d'utiliser Context.Entry afin de charger les relations requises uniquement lorsque j'en ai besoin, voir ci-dessous:
await Context.Entry(entity).Collection(e => e.DBTable1).LoadAsync();
await Context.Entry(entity).Collection(e => e.DBTable2).LoadAsync();
Ce que je suis curieux de savoir, c'est si vous pouvez combiner plusieurs relations en une seule instruction de charge, comme ci-dessous:
await Context.Entry(entity).Collection(e => e.DBTable1 && e => e.DBTable2).LoadAsync();
Je sais que je peux utiliser .Include / .ThenInclude pour créer les relations avant d'exécuter la requête EF. Toutefois, mon flux de travail nécessite que les relations soient chargées après l'exécution de la requête.
Les propriétés / collections de navigation des entités suivies dans EF doivent être renseignées lorsque les données requises sont chargées. Essayez de projeter les propriétés / collections souhaitées dans un type anonyme et en vérifiant que les propriétés attendues sont renseignées dans votre objet entité d'origine:
await dbContext.Set<TEntity>()
.Where( e => e.Id == entity.Id )
.Select( e => new
{
DoesntMatter01 = e.DBTable1,
DoesntMatter02 = e.DBTable2,
} )
.SingleOrDefaultAsync();
Notez que vous ne vous souciez pas du résultat tant que la requête est énumérée. Dans ce cas, nous utilisons SingleOrDefault
mais il est possible de charger ces propriétés pour toutes les entités suivies d'un type donné de la même manière si nous sélectionnons les identifiants d'une collection d'entités, puis utilisons ids.Contains( e.Id )
à l' where
puis ToArray
via un appel à ToArray
ou une méthode similaire qui renverra tous les résultats.
Exécutez-le et vérifiez que les propriétés de la collection sont maintenant remplies comme prévu.
Edit: depuis que je me sentais tellement motivé:
public Task LoadEntityCollections( DbContext dbContext, IEnumerable<EntityType> entities )
{
dbContext.Set<EntityType>()
.Where( e => entities.Select( ei => ei.Id ).Contains( e.Id ) )
.Select( e => new
{
// assign from properties you want loaded
} )
.ToArrayAsync();
}