Entity Framework 核心不加载一些相关对象

Entity Framework Core Doesn't load some of the related object

我正在开发基于 ASP.NET 核心和 Entity Framework 核心的项目。 我在这里使用通用存储库模式。当我在特定对象上检索时,几乎没有检索到相同的对象,但有些对象未加载。请参考以下屏幕截图。

模式实现请参考以下内容:

请参考下面的调试器视图:

上图显示此对象检索“优惠”而非“位置”。

参考下图的“OfferLocation”class:

对这种情况有什么想法吗?

你只需要使用这个包。

Microsoft.EntityFrameworkCore.Proxies

并在上下文中使用这行代码。

protected override void OnConfiguring (DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseLazyLoadingProxies ();
}

当您使用其他包时,此包会自动包含 Collection。

在您的代码中,您请求 Offer 并告诉 EF.Core 包含 OfferLocations 属性。 OfferLocation 引用回请求的 Offer 对象,这就是它被设置的原因。如果你想让 Location 包含在这个请求中,你必须在 Include 之后使用 ThenInclude 方法。例如。如果您使用数据库上下文检索数据,它可能如下所示:

context.Offers
    .Include(o => o.OfferLocations)
        .ThenInclude(ol => ol.Location)
    .FirstOrDefaultAsync(o => o.Id == id);

但是使用通用存储库方法,您将包含表达式的集合作为 Expression<Func<T, object>>[] includeExpression 传递,这显然不允许您使用 ThenInclude.

您可以使用本文 中描述的方法。

public Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate = null,
                                         Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null,
                                         CancellationToken cancellationToken = default)
{
    IQueryable<TEntity> query = this.DbSet;

    if (include != null)
    {
        query = include(query);
    }

    if (predicate != null)
    {
        query = query.Where(predicate);
    }

    return query.FirstOrDefaultAsync(cancellationToken);
}

用法:

var offer = await this.unitOfWork.Offers.FirstOrDefaultAsync(
    predicate: o => o.Id == id,
    include: source => source
        .Include(o => o.Partner)
        .Include(o => o.SubCategory)
        .Include(o => o.Category)
        .Include(o => o.OfferItems)
        .Include(o => o.OfficeLocations)
            .ThenInclude(ol => ol.Location));