实体框架核心不加载某些相关对象

时间:2019-08-28 05:48:04

标签: asp.net-core ef-core-2.2

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

有关模式的实现,请参考以下内容:

enter image description here

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

enter image description here

上图显示该对象检索“要约”,而不是“位置”。

对于“ OfferLocation”类,请参考以下图像:

enter image description here

关于这种情况有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在您的代码中,您请求Offer并告诉EF.Core包含OfferLocations属性。 OfferLocation引用了所请求的Offer对象,这就是它为什么被设置的原因。如果要在此请求中包含Location,则必须在ThenInclude之后使用Include方法。例如。如果您使用数据库上下文来检索数据,则它可能像这样:

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

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

您可以使用此answer中描述的方法。

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

答案 1 :(得分:0)

您只需要使用此软件包即可。

  

Microsoft.EntityFrameworkCore.Proxies

在上下文中使用此代码行。

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

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