指定的包含路径无效。 EntityType不声明名称为*的导航属性

时间:2013-12-17 15:14:24

标签: c# linq entity-framework

我正在尝试从LocalDb获取数据到我的MVC控制器中。我试过这个:

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

它返回此错误:

  

指定的包含路径无效。 EntityType   'ChatProj.Models.UserProfile'未声明导航属性   名称为'LastName'。

Here is a picture of my localDb and model.

知道为什么它不起作用吗?

4 个答案:

答案 0 :(得分:35)

导航属性应该是相关实体集合的实体类型。包含一些导航属性意味着加入您当前的实体与一些相关的实体。这允许在单个查询中从几个表中急切加载数据。 LastName不是导航属性 - 它是简单字段,默认情况下会加载,您不需要包含它:

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

此查询将转换为类似

的内容
SELECT UserId, UserName, LastName, FirstName 
FROM UserProfiles
WHERE UserId = @value

答案 1 :(得分:20)

Include仅适用于导航属性,LastName是标量属性,因此您根本不需要Include

答案 2 :(得分:13)

尽管这与问题并不完全相关,但由于Google将您带到这里,我认为可能有必要注意您可能会使用IEnumerable来收集您的信息。相反,您应该使用ICollection,请在此处查看更多内容:https://stackoverflow.com/a/32997694/550975

答案 3 :(得分:6)

如果您只想检索LastName,请使用

Select(m => m.LastName)

所以

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

LastName只是模型中的字符串(Scalar属性),而不是Navigation属性(与其他实体的关系)