首页 > 解决方案 > EF Core:分离的延迟加载导航实体。为什么?

问题描述

我有以下模型:

public partial class Device
{
    public int Id { get; set; }
    public virtual Tablet Tablet { get; set; }

以下内容在哪里Tablet

public class Tablet
{
    public string TabletId { get; set; }

    public int DeviceId { get; set; }
    public virtual Device Device { get; set; }

    private ICollection<TabletTransferRequest> _tabletTransferRequests;
    public virtual ICollection<TabletTransferRequest> TabletTransferRequests { get => _tabletTransferRequests ?? (_tabletTransferRequests = new List<TabletTransferRequest>()); protected set => _tabletTransferRequests = value; }
}

和映射类:

public class TabletMap : IEntityTypeConfiguration<Tablet>
{
    public void Configure(EntityTypeBuilder<Tablet> builder)
    {
        builder.ToTable(nameof(Tablet));
        builder.HasKey(p => p.TabletId);

        builder.HasOne(p => p.Device)
            .WithOne(o => o.Tablet)
            .HasForeignKey<Tablet>(p => p.DeviceId)
            .IsRequired()
            .OnDelete(DeleteBehavior.Restrict)
            ;
    }
}

DTO 类:

public class DeviceDisplayDto
{
    public int Id { get; set; }
    public TabletPartDto Tablet { get; set; }
}

public class TabletPartDto
{
    public string TabletId { get; set; }
    public List<TabletTransferRequestElementDto> TabletTransferRequests { get; set; }
}


public class TabletTransferRequestElementDto : DeviceRequestElementAbstractDto
{
    public string TabletId { get; set; }
    public int DeviceId { get; set; }
}

当我尝试执行以下操作时

        var query = _context.Devices.Include(d => d.Tablet).ThenInclude(d => d.TabletTransferRequests);
        var devices = new PagedList<DeviceDisplayDto>(query.ProjectTo<DeviceDisplayDto>(_mapperConfig), pageIndex, pageSize);

我得到以下信息:

为警告“Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning”生成错误:尝试在“TabletProxy”类型的分离实体上延迟加载导航属性“TabletTransferRequests”。分离实体或使用“AsNoTracking()”加载的实体不支持延迟加载。通过将事件 ID 'CoreEventId.DetachedLazyLoadingWarning' 传递给 'DbContext.OnConfiguring' 或 'AddDbContext' 中的 'ConfigureWarnings' 方法,可以抑制或记录此异常。

为什么它是分离的?

标签: c#entity-frameworkentity-framework-core

解决方案


错误是否发生在var devices = new PagedList(...)或之后,例如控制器方法完成时?我不认识 PagedList 实现,但是从您输入的内容来看,该再现似乎是在初始化IQueryable<T>而不是静态集合,如果最终尝试从初始加载后解决分页IList<T>问题,​​这可能是一个问题。PagedListIQueryable

通常 PagedList 在使用ToPagedList(page, pageSize)时会使用一种方法IQueryable来触发页面的一次性加载。如果编写为使用 初始化的类IQueryable,则在释放 DbContext 后进行查询时,数据检索查询可能是不可填充的。


推荐阅读