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
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
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
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.
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);
});
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:
Cette ligne se glisse dans OnConfiguring sur votre contexte de données:
optionsBuilder.UseLazyLoadingProxies();
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.
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 .