【问题标题】:EF Core ICollection does not contain a definition for 'Include'EF Core ICollection 不包含“包含”的定义
【发布时间】:2018-07-24 09:11:00
【问题描述】:

我有一个 head 和一个 details 模型,它们之间有导航属性。我想获得包含详细信息的头部记录。这工作正常,但我得到的详细记录不包含我需要的所有属性,所以我尝试添加 Include()。

EF Core 说ICollection<RequestDetail> does not contain a definition for 'Include'。我已经尝试过 List 导航类型,Microsoft.EntityFrameworkCoreSystem.Linq 都在我的使用中。

我的模型:

public class RequestHead
{
    public string Id { get; set; }
    public DateTime CreateDate { get; set; }
    public int CreateUserId { get; set; }
    [ForeignKey("CreateUserId")]
    public User CreateUser { get; set; }

    public virtual ICollection<RequestDetail> Details { get; set; }
}
public class RequestDetail
{
    [Key]
    public int Id { get; set; }

    public string RequestHeadId { get; set; }        
    [ForeignKey("RequestHeadId")]
    public RequestHead RequestHead { get; set; }

    public DateTime CreateDate { get; set; }
    public int CreateUserId { get; set; }
    [ForeignKey("CreateUserId")]
    public User CreateUser { get; set; }
}

选择:

 var requests = (from r in _ctx.RequestHeads
                select new RequestDTO {
                    AcceptDate = r.AcceptDate,
                    AcceptUser = r.AcceptUser,
                    AcceptUserId = r.AcceptUserId,
                    Details = r.Details != null ? 
 r.Details.Include(x => x.BuyerUser).Select(x => new 
 RequestDetailDTO(x, x.Attachments.ToArray(), x.Product)).ToArray() : null});

更新#1:

这不是 Json.ReferenceLoopHandling 问题。它已经在 startup.cs 中被忽略了,我的问题是即使在我的代码中我也不能使用 Include() ,而不仅仅是在 json 中没有必要的属性。

【问题讨论】:

  • 我认为这不是重复的。我已经有 Json.ReferenceLoopHandling.Ignore 我的问题是我什至不能在我的代码中使用 Include() 不是因为它没有给我必要的属性。
  • 就像错误所说的那样。 .Include 仅适用于 IQueryables,而 r.Details 是 ICollection(导航属性本身)。改为包含 x=>x.Details.Select(y=>y.BuyerUser)。
  • @DevilSuichiro 是的,我只需将导航属性添加到选择中,它就会全部加载。谢谢!你会发布答案吗?

标签: c# entity-framework entity-framework-core ef-core-2.1


【解决方案1】:

就像错误提示的那样:您的属性 r.Details 是一个 ICollection(导航属性)并且不公开 .Include() 方法,该方法仅适用于 IQueryables(扩展方法)。包含路径应​​该从返回的 IQueryable 指向您希望包含的导航属性,在您的情况下,这应该类似于

.Include(x=>x.Details.Select(y=>y.BuyerUser))

【讨论】:

    【解决方案2】:

    如果在 .NET 上开发 - 请确保您使用的是 System.Data.Entity 命名空间。

    using System.Data.Entity;
    

    如果在 .NET Core 上 - 请改用 Microsoft.EntityFrameworkCore。

    using Microsoft.EntityFrameworkCore;
    

    【讨论】:

    • .NET Core 中没有这样的命名空间。它等效于 Microsoft.EntityFrameworkCore 并且已经包含在内。
    • 你是对的@Perrier,这个命名空间是为 .net 而不是 .net core。
    • 这实际上帮助了我解决我的问题,谢谢!容易忽略的事情。
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多