我正在尝试从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.
知道为什么它不起作用吗?
答案 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属性(与其他实体的关系)