c# - 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' 方法,可以抑制或记录此异常。
为什么它是分离的?
解决方案
错误是否发生在var devices = new PagedList(...)
或之后,例如控制器方法完成时?我不认识 PagedList 实现,但是从您输入的内容来看,该再现似乎是在初始化IQueryable<T>
而不是静态集合,如果最终尝试从初始加载后解决分页IList<T>
问题,这可能是一个问题。PagedList
IQueryable
通常 PagedList 在使用ToPagedList(page, pageSize)
时会使用一种方法IQueryable
来触发页面的一次性加载。如果编写为使用 初始化的类IQueryable
,则在释放 DbContext 后进行查询时,数据检索查询可能是不可填充的。
推荐阅读
- dialogflow-es - Dialogflow 在跟进后自动进入默认欢迎意图,尽管告诉它不要
- javascript - How can I get the coordinates of a given element in react tsx
- c++ - 为什么 span 的数组和 std::array 构造函数与其容器构造函数不同
- serial-port - 监控 CANBus 到 PC - RS232 - 触摸编码器
- javascript - 移动版 Google Chrome 中的 Vimeo SDK 问题
- reactjs - 从 react.js 中的 url 获取 id
- python - 如何修复错误“错误:命令错误退出状态 1:python。” 尝试使用 pip 安装 django-heroku 时
- c# - 初始化静态类的属性失败,出现空值异常
- latex - 与它定义的命令相比,如何解释乳胶中 \newcommand 的语法
- django - How to manage change Emailid and Change Password for user logged in using Social Media in Django all-auth?