我正在使用带有Proxy的EF Core 2.2.3的延迟加载,该加载项与DbSets配合良好。现在,我必须从SQL视图加载数据,并且正在为此使用DbQuery。当尝试为查询中使用的实体加载相关数据时,我得到了DetachedLazyLoadingWarning:
生成警告错误 'Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning: 试图延迟加载导航属性“ ProjectStatus” 在类型为“ ProjectProxy”的分离实体上。延迟加载不是 支持分离实体或已加载的实体 'AsNoTracking()'。”。可以抑制或记录此异常 将事件ID'CoreEventId.DetachedLazyLoadingWarning'传递给 'DbContext.OnConfiguring'中的'ConfigureWarnings'方法或 “ AddDbContext”。
我不在代码中的任何地方使用AsNoTracking()。
DbQuery在上下文的c
中定义。摘录:
OnModelCreating
modelBuilder.Query<ProjectView>()
.ToQuery(() => Projects
.Select(p => new ProjectView()
{
Id = p.Id,
ProjectCategory = p.ProjectCategory,
ProjectPhase = p.ProjectStatus.ProjectPhase,
}));
是上下文的DbSet。
Projects
是使用关系Project.ProjectCategory
的notMapped-Readonly-Property。
上下文的属性:
Project.ProjectStatus
课程摘录:
public virtual DbSet<Project> Projects { get; set; }
public virtual DbSet<ProjectStatus> ProjectStatus { get; set; }
public virtual DbQuery<ProjectView> ProjectViews { get; set; }
如何使此DbQuery的延迟加载工作?
非常感谢您。
答案 0 :(得分:0)
这只是种错误(尚未找到解决方法,issue仍处于打开状态)。另请参阅this。按照建议,我引用
请注意,可以使用DbContextOptionsBuilder中的ConfigureWarnings将警告配置为不抛出警告。
答案 1 :(得分:0)
这似乎是设计使然,无论是否使用.AsNoTracking()。我没有找到任何文档。
如果您陷在.net core 2上,我发现的唯一解决方法是在单独的查询中加载相关实体。有效地打破了延迟加载。
从.net core 3+开始,使用延迟加载时,可以通过渴望加载相关属性(.Include(x => x.ProjectStatus))来解决此问题。该问题的解决方法是:https://github.com/aspnet/EntityFrameworkCore/issues/12780。并且使用延迟加载时的错误消息已更改为:“无法跟踪类型为'FooQuery'的实例,因为它没有主键。只能跟踪具有主键的实体类型。'