0
votes

La requête Linq renvoie null lors de l'utilisation de la relation principale EF

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.


5 commentaires

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.


3 Réponses :


3
votes

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();


0 commentaires

1
votes

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();


0 commentaires

1
votes

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);


0 commentaires