如何在EF Core中对DbQuery使用延迟加载?

时间:2019-04-16 13:27:25

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

我正在使用带有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的延迟加载工作?

非常感谢您。

2 个答案:

答案 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'的实例,因为它没有主键。只能跟踪具有主键的实体类型。'