web-dev-qa-db-fra.com

Un chemin d'inclusion spécifié n'est pas valide. L'EntityType ne déclare pas une propriété de navigation avec le nom *

J'essaie d'obtenir des données d'un LocalDb dans mon contrôleur MVC. J'ai essayé ceci:

UsersContext db = new UsersContext();
var users = db.UserProfiles.Where(u => u.UserId == WebSecurity.CurrentUserId)
                           .Include(u => u.LastName).ToList();

Il renvoie cette erreur:

Un chemin d'inclusion spécifié n'est pas valide. L'EntityType 'ChatProj.Models.UserProfile' ne déclare pas une propriété de navigation avec le nom 'LastName'.

Voici une photo de mon localDb et de mon modèle.

Une idée pourquoi ça ne marche pas?

34
JazzMaster

La propriété de navigation doit être de type entité de collection d'entités liées. Inclure une propriété de navigation signifie joindre votre entité actuelle avec une ou plusieurs entités liées. Cela permet un chargement rapide des données de plusieurs tables en une seule requête. LastName n'est pas une propriété de navigation - c'est un champ simple, et il sera chargé par défaut, vous n'avez pas besoin de l'inclure:

UsersContext db = new UsersContext();
var users = db.UserProfiles.Where(u => u.UserId == WebSecurity.CurrentUserId)
                           .ToList();

Cette requête sera traduite en quelque chose comme

SELECT UserId, UserName, LastName, FirstName 
FROM UserProfiles
WHERE UserId = @value
35
Sergey Berezovskiy

Include est uniquement pour les propriétés de navigation et LastName est une propriété scalaire, vous n'avez donc pas besoin de Include du tout.

20
Thomas Levesque

Même si ce n'est pas tout à fait lié à la question, puisque Google vous amène ici, j'ai pensé qu'il pourrait être utile de remarquer qu'une possibilité probable est que vous utilisez IEnumerable pour votre collection. Au lieu de cela, vous devriez utiliser ICollection, voir plus ici: https://stackoverflow.com/a/32997694/550975

Cela semble être un problème dans EF6 et peut-être des versions antérieures seulement ... ce n'est plus un problème à utiliser dans EF Core.

15
Serj Sagan

Si vous souhaitez récupérer uniquement le LastName, utilisez

Select(m => m.LastName)

alors

 var users = db.UserProfiles
                .Where(u => u.UserId == WebSecurity.CurrentUserId)
                .Select(u => u.LastName)//not Include
                .ToList();

LastName n'est qu'une chaîne (propriété scalaire) dans votre modèle, pas une propriété Navigation (relation avec une autre entité)

6
Raphaël Althaus