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



我正在使用带有代理的EF Core 2.2.3的延迟加载,该代理与DbSets配合良好。现在,我必须从SQL视图加载数据,并且为此使用了DbQuery。尝试加载查询中使用的实体的相关数据时,我收到一个分离的懒惰加载警告:

为警告生成错误 'Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadWarning: 尝试延迟加载导航属性"项目状态" 在类型为"项目代理"的分离实体上。延迟加载不是 支持分离的实体或加载了 'AsNoTracking()'.'.此异常可以由 将事件 ID "CoreEventId.DetachedLazyLoadWarning" 传递给 'DbContext.OnConfiguring' 中的 'ConfigureWarnings' 方法或 'AddDbContext'.

我不在我的代码中的任何地方使用 AsNoTracking()。

DbQuery 是在上下文OnModelCreating定义的。摘录:

modelBuilder.Query<ProjectView>()
.ToQuery(() => Projects
.Select(p => new ProjectView()
{
Id = p.Id,
ProjectCategory = p.ProjectCategory,
ProjectPhase = p.ProjectStatus.ProjectPhase,
}));

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; }

课程摘录:

public partial class Project
{
[NotMapped]
public string ProjectCategory
{
get
{
if (this.ProjectStatus == null)
return string.Empty;
var foo = "someweiredcalculations";
return foo
}
}
public virtual ProjectStatus ProjectStatus { get; set; }
public int ProjectStatusId { get; set; }
public int Id { get; set; }
}
public class ProjectView
{
public int Id { get; set; }
public string ProjectCategory { get; set; }
public string ProjectPhase { get; set; }
}
public partial class ProjectStatus : BaseEntity, IIdEntity<int>
{
public int Id { get; set; }
public string ProjectPhase { get; set; }
public virtual ICollection<Project> Projects { get; set; } = new HashSet<Project>();
}

如何使延迟加载适用于此 DbQuery?

谢谢。

这只是一个错误(尚未找到解决方法,问题仍然未解决)。另请阅读此内容。按照建议,我正在引用

请注意,可以将警告配置为不使用 DbContextOptionsBuilder 中的 ConfigureWarnings 引发。

这似乎是设计使然,无论是否.AsNoTracking() 是否被使用。我没有找到任何关于此的文档。

如果您被困在 .net core 2 上,我发现的唯一解决方法是在单独的查询中加载相关实体。有效打破延迟加载。

从 .net core 3+ 开始,可以通过预先加载相关属性 (.包括(x => x.ProjectStatus)) 当使用延迟加载时。此问题由以下人员修复:https://github.com/aspnet/EntityFrameworkCore/issues/12780。使用延迟加载时的错误消息更改为:"无法跟踪类型为'FooQuery'的实例,因为它没有主键。只能跟踪具有主键的实体类型。

相关内容

  • 没有找到相关文章

最新更新