web-dev-qa-db-fra.com

Entity Framework Core - Chargement différé

Cédant à ma demande Visual Studios, j'ai commencé mon dernier projet en utilisant Entity Framework Core (1.0.1)

Donc, j'écris mes modèles de base de données comme je l'ai toujours en utilisant le spécificateur "virtuel" pour permettre le chargement paresseux d'une liste. Bien que lors du chargement de la table parent, il semble que la liste enfant ne se charge jamais.

Modèle parent

public class Events
{
    [Key]

    public int EventID { get; set; }
    public string EventName { get; set; }
    public virtual List<EventInclusions> EventInclusions { get; set; }
}

modèle enfant

public class EventInclusions
{
    [Key]
    public int EventIncSubID { get; set; }
    public string InclusionName { get; set; }
    public string InclusionDesc { get; set; }
    public Boolean InclusionActive { get; set; }

}

L'ajout de nouveaux enregistrements à ces tables semble fonctionner car je suis habitué à l'endroit où je peux imbriquer les enregistrements EventInclusions en tant que liste dans l'enregistrement d'événements.

Mais quand je recherche ce tableau

_context.Events.Where(e => e.EventName == "Test")

Le problème

EventInclusions renverra une valeur nulle quelles que soient les données en arrière-plan.

Après avoir lu un peu, j'ai l'impression que c'est un changement entre EF6 que j'utilise normalement et EF Core

Je pourrais utiliser de l'aide pour créer une instruction Lazy Loading sur une couverture ou trouver le nouveau format pour spécifier le chargement paresseux.

Caz

36
Caz1224

Il semble donc qu'EF Core ne supporte pas actuellement le chargement paresseux. Sa venue, mais peut-être un certain temps.

Pour l'instant, si quelqu'un d'autre rencontre ce problème et se débat. Vous trouverez ci-dessous une démonstration de l'utilisation de Chargement avide qui est pour l'instant ce que vous devez utiliser.

Dites avant d'avoir un objet personne et cet objet contenait une liste de chapeaux dans une autre table.

Plutôt que d'écrire

var person = _context.Person.Where(p=> p.id == id).ToList();

person.Hats.Where(h=> h.id == hat).ToList();

Vous devez écrire

var person = _context.Person.Include(p=> p.Hats).Where(p=> p.id == id).ToList();

Et puis person.Hats.Where(h=> h.id == hat).ToList(); fonctionnera

Si vous avez plusieurs listes - enchaînez les inclusions

var person = _context.Person.Include(p=> p.Hats).Include(p=> p.Tickets)
                            .Include(p=> p.Smiles).Where(p=> p.id == id).ToList();

Je comprends un peu pourquoi cette méthode est plus sûre, que vous ne chargez pas d'énormes ensembles de données qui pourraient ralentir les choses. Mais j'espère qu'ils reprendront bientôt le chargement de Lazy !!!

Caz

35
Caz1224

Le chargement différé est désormais disponible sur EF Core 2.1 et voici le lien vers les documents pertinents:

https://docs.Microsoft.com/en-us/ef/core/querying/related-data#lazy-loading

35
Elijah Lofgren

vous pouvez installer ce package pour activer le chargement paresseux dans EF Core 2.1.

Microsoft.EntityFrameworkCore.Proxies

puis définissez cette configuration dans votre ef dbContext

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     => optionsBuilder
           .UseLazyLoadingProxies()
           .UseSqlServer("myConnectionString");

"Remarque" ce package ne fonctionne que sur EF Core 2.1 et supérieur.

20
pejman

Pour EF Core 2.1 et supérieur,

Installer:

 dotnet add package Microsoft.EntityFrameworkCore.Proxies --version 2.2.4 

Mettez ensuite à jour votre fichier Startup.cs comme indiqué ci-dessous.

using Microsoft.EntityFrameworkCore.Proxies;



services.AddEntityFrameworkProxies();
services.AddDbContext<BlogDbContext>(options =>
            {
                options.UseSqlite(Configuration.GetSection("ConnectionStrings")["DefaultConnection"]);
                options.UseLazyLoadingProxies(true);
            });
7
Kowi

Il y a une version pré-release qui vient de sortir, même si elle est censée être disponible en version complète bientôt.

Quelques mises en garde:

  • Toutes vos propriétés de données qui sont plus que des types simples (c'est-à-dire: toutes les autres classes/tables) doivent être des réseaux virtuels publics (les échafaudages par défaut ne le sont pas).
  • Cette ligne se glisse dans OnConfiguring sur votre contexte de données:

        optionsBuilder.UseLazyLoadingProxies();
    
  • C'est (actuellement) une pré-version, alors la force peut être avec vous.
7
Eric

LazyLoading n'est pas encore pris en charge par EF Core, mais il existe une bibliothèque non officielle qui permet LazyLoading: https://github.com/darxis/EntityFramework.LazyLoading . Vous pouvez l'utiliser jusqu'à ce qu'il soit officiellement pris en charge. Il prend en charge EF Core v1.1.1. Il est disponible sous forme de package nuget: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.LazyLoading/

Avertissement: je suis le propriétaire de ce dépôt et je vous invite à l'essayer, à signaler des problèmes et/ou à contribuer.

4
Darxis

Le chargement différé devrait être dans EF core 2.1 - vous pouvez en savoir plus sur les raisons pour lesquelles il s'agit d'une fonctionnalité indispensable - ici .

3
baHI