Entity Framework Core 2.1 проблема с DetachedLazyLoadingWarning - PullRequest
0 голосов
/ 10 ноября 2018

Я получаю исключение с DetachedLazyLoadingWarning:

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

при попытке запроса базы данных SQL с помощью Entity Framework Code 2.1

Это мой запрос:

var orders = 
    _context
    .Set<Order>()
    .Where(v => v.CompanyId == companyId)
    .Include(v => v.Details)
    .ThenInclude(d => d.Delivery)
    .ThenInclude(v => v.Product)
    .OrderByDescending(v=> v.Details.FirstOrDefault().Delivery.Product.ProductId)
    .ThenByDescending(v=> v.Details.FirstOrDefault().Delivery.Value)
    .ThenByDescending(v => v.CreatedAt)
    .Page(request.Page, request.RowsPerPage);

Вот сущности и отношения:

public class Order : IEntity<int>
{
    public int CompanyId { get; set; }

    public virtual ICollection<OrderDetails> Details { get; set; }

    [Required]
    public DateTimeOffset CreatedAt { get; set; }

    [Key]
    public int Id { get; set; }
}

public class OrderDetails : IEntity<int>
{
    public int OrderId { get; set; }

    public int DeliveryId { get; set; }

    [ForeignKey(nameof(OrderId))]
    public virtual Order Order { get; set; }

    [ForeignKey(nameof(DeliveryId))]
    public virtual Delivery Delivery { get; set; }

    [Key]
    public int Id { get; set; }
}

public class Delivery : IEntity<int>
{
    [Required]
    public int ProductId { get; set; }

    public int Value { get; set; }

    [ForeignKey(nameof(ProductId))]
    public virtual Product Product { get; set; }

    [Key]
    public int Id { get; set; }
}

[Table("Products")]
public class Product : IEntity<int>
{
    [Required]
    public byte ProductCategoryId { get; set; }


    public virtual ICollection<Delivery> Deliveries { get; set; }

    [Key]
    public int Id { get; set; }
}

Похоже, Details.FirstOrDefault () отсоединяет сущность Delivery. То же самое решение работало с Entity Framework 6. Как я могу улучшить свой запрос, чтобы получить дату из базы данных, используя только один запрос (подавление спаривания не помогло)?

1 Ответ

0 голосов
/ 11 ноября 2018

Вы также должны увидеть много Регистрация оценки клиента предупреждения. И в настоящее время оценка клиента не подходит для явной / отложенной загрузки.

Причиной оценки клиента в этом случае является выражение v.Details.FirstOrDefault() внутри методов упорядочения. И задача текущей стадии EF Core - найти поддерживаемую переводимую эквивалентную конструкцию LINQ.

В этом конкретном сценарии решение (обходной путь) заключается в использовании промежуточной проекции SelectMany с Take(1). Замените деталь, начиная с .OrderByDescending(..) до Page(...), следующим текстом:

.SelectMany(
    o => o.Details.Select(d => d.Delivery).Take(1).DefaultIfEmpty(),
    (o, d) => new { Order = o, Delivery = d })
.OrderByDescending(v => v.Delivery.ProductId)
.ThenByDescending(v => v.Delivery.Value)
.ThenByDescending(v => v.Order.CreatedAt)
.Select(v => v.Order) // restore the original projection
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...