指定的包含路径无效。 EntityType 未声明名称为 * 的导航属性
Posted
技术标签:
【中文标题】指定的包含路径无效。 EntityType 未声明名称为 * 的导航属性【英文标题】:A specified Include path is not valid. The EntityType does not declare a navigation property with the name * 【发布时间】:2013-12-17 15:14:24 【问题描述】:我正在尝试将数据从 LocalDb 获取到我的 MVC 控制器中。我试过这个:
UsersContext db = new UsersContext();
var users = db.UserProfiles.Where(u => u.UserId == WebSecurity.CurrentUserId)
.Include(u => u.LastName).ToList();
它返回这个错误:
指定的包含路径无效。实体类型 'ChatProj.Models.UserProfile' 未声明导航属性 名称为“姓氏”。
Here is a picture of my localDb and model.
知道为什么它不起作用吗?
【问题讨论】:
我宁愿建议你阅读这篇文章 ***.com/questions/3356541/…> 【参考方案1】:导航属性应该是相关实体集合的实体类型。包含一些导航属性意味着加入您当前的实体与一些相关的实体或实体。这允许在单个查询中从多个表中急切加载数据。 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
【讨论】:
干杯 m8,很好的答案! @JazzMaster 欢迎 :) 也考虑阅读 Navigation Properties @SergeyBerezovskiy,你介意看看我的问题吗? ***.com/questions/28988951/… 所以没有办法避免总是加载 UserProfiles 中的所有属性? 我看到人们(包括我自己)最常犯的错误是包含枚举属性。或者,将一个实体重构为一个枚举,然后这会默默地在你的脸上爆炸。【参考方案2】:Include
仅用于导航属性,LastName
是标量属性,因此您根本不需要Include
。
【讨论】:
我自己说得再好不过了。非常简洁。 在看到您的回答之前,我不知道我的错误来自哪里。说够了。 +1【参考方案3】:尽管这与问题不太相关,但由于 Google 将您带到这里,我认为注意到您可能正在使用 IEnumerable
作为您的收藏集可能会有所帮助。相反,您应该使用 ICollection
,在此处查看更多信息:https://***.com/a/32997694/550975
这似乎是EF6
中的一个问题,也许只是更早的版本...不再是EF Core
中的问题。
【讨论】:
【参考方案4】:如果您只想检索LastName
,请使用
Select(m => m.LastName)
所以
var users = db.UserProfiles
.Where(u => u.UserId == WebSecurity.CurrentUserId)
.Select(u => u.LastName)//not Include
.ToList();
LastName
只是模型中的一个字符串(标量属性),而不是导航属性(与另一个实体的关系)
【讨论】:
【参考方案5】:在我的情况下,我解决了以下问题
有错误的代码:
LabResults = db.LAB_RESULTS.Where(o => o.ORDER_ID == id)
.Include(p => p.LabTests).ToList()
然后我删除了 .Include :
LabResults = db.LAB_RESULTS.Where(o => o.ORDER_ID == id).ToList()
【讨论】:
以上是关于指定的包含路径无效。 EntityType 未声明名称为 * 的导航属性的主要内容,如果未能解决你的问题,请参考以下文章
EF迁移时报错“未定义键。请为该 EntityType 定义键。