【问题标题】:A specified Include path is not valid. The EntityType does not declare a navigation property with the name *指定的包含路径无效。 EntityType 未声明名称为 * 的导航属性
【发布时间】: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.

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

【问题讨论】:

标签: c# linq entity-framework


【解决方案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,你介意看看我的问题吗? stackoverflow.com/questions/28988951/…
  • 所以没有办法避免总是加载 UserProfiles 中的所有属性?
  • 我看到人们(包括我自己)最常犯的错误是包含枚举属性。或者,将一个实体重构为一个枚举,然后这会默默地在你的脸上爆炸。
【解决方案2】:

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

【讨论】:

  • 我自己说得再好不过了。非常简洁。
  • 在看到您的回答之前,我不知道我的错误来自哪里。说够了。 +1
【解决方案3】:

尽管这与问题不太相关,但由于 Google 将您带到这里,我认为注意到您可能正在使用 IEnumerable 作为您的收藏集可能会有所帮助。相反,您应该使用 ICollection,在此处查看更多信息:https://stackoverflow.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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多