Как использовать Lazy Loading для DbQuery в EF Core? - PullRequest
0 голосов
/ 16 апреля 2019

Я использую Lazy Loading для EF Core 2.2.3 с прокси, который хорошо работает с DbSets.Теперь я должен загрузить данные из SQL View и использую DbQuery для этого.При попытке загрузить связанные данные для сущности, используемой в запросе, я получаю DetachedLazyLoadingWarning:

Ошибка, сгенерированная для предупреждения 'Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning: была предпринята попытка lazy-загрузить свойство навигации ProjectStatus на отдельную сущность типа ProjectProxy.Ленивая загрузка не поддерживается для отдельных объектов или объектов, которые загружены с помощью «AsNoTracking ()».Это исключение можно подавить или зарегистрировать, передав идентификатор события «CoreEventId.DetachedLazyLoadingWarning» методу «ConfigureWarnings» в «DbContext.OnConfiguring» или «AddDbContext».

Я не использую AsNoTracking ()где-нибудь в моем коде.

DbQuery определен в OnModelCreating контекста.Выдержка:

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

Projects является DbSet контекста.Project.ProjectCategory - это свойство notMapped-Readonly-, которое использует отношение 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>();

    }

Как я могу заставить Lazy Loading работать для этого DbQuery?

Большое спасибо.

1 Ответ

0 голосов
/ 16 апреля 2019

Это всего лишь своего рода ошибка (не нашли обходного пути, и проблема все еще открыта).Также прочитайте это .Как рекомендовано и я цитирую

Обратите внимание, что предупреждение можно настроить так, чтобы оно не генерировалось с использованием ConfigureWarnings в DbContextOptionsBuilder.

...