Deux classes définies comme ci-dessous:
class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } }
et lors de l'utilisation de cette requête Linq:
var posts = context.Blog.FirstOrDefault (e => e.BlogId == 1) .Posts.ToList ();
une exception est levée indiquant que la valeur ne peut pas être nulle.
Et dans la vue des résultats, la colonne Articles du tableau du blog pour chaque ligne est vide.
3 Réponses :
Essayez de réécrire la requête
FirstOrDefault
provoque l'interrogation de la base de données et donc la relation peut ne pas être chargée
Par conséquent, effectuez une projection avant d'interroger:
var posts = context.Blog .Include(b => b.Posts) .FirstOrDefault(e => e.BlogId == 1) ?.Posts;
Une autre alternative consiste à utiliser .Include ()
var posts = context.Blog .SelectMany(b => b.Posts) .Where(p => p.BlogId == 1) .ToList();
Il vaut mieux que vous puissiez inclure la clause select ici. L'appel de FirstOrDefault () sur votre requête renverra le premier résultat de la requête ou la valeur par défaut du type (très probablement null dans ce cas). essayez ceci
var posts = (from e in context.Blog where e.BlogId == 1 select e).FirstOrDefault();
Comme il n'y a pas de chargement paresseux, vous devez inclure l'entité Posts
if(blog != null) { ... do your work }
car vous faites Firtordefault, vous devez vérifier la valeur nulle
var blog = context.Blog .Include(b => b.Posts) .FirstOrDefault(e => e.BlogId == 1);
Avez-vous lu la documentation? par exemple. docs.microsoft.com/en-us/ef/core/ interrogation / données-associées
Exécutez-vous cela sur un fournisseur de base de données réel (comme localdb), dans une base de données de mémoire ou un autre fournisseur? Pouvez-vous partager plus de trace de la pile de l'erreur?
La table Blog ne peut pas non plus avoir de colonne Posts. Ce n'est pas ainsi que les bases de données fonctionnent habituellement et certainement pas comment fonctionne EF Core ORM. Alors peut-être que c'était "Post column" au lieu de "Posts column" ou "Blog Array" au lieu de "Blog Table"?
@JoshuaWebb a probablement raison. Si le chargement paresseux n'est pas activé sur votre contexte de base de données, vous obtiendrez des erreurs en essayant de le faire sans l'instruction
Include ()
.... mais je m'attendrais à un message d'erreur différent ...Merci beaucoup les gars, j'ai l'idée de vos commentaires.