我正在基于ASP.NET Core和Entity Framework核心的项目。 我在这里使用通用存储库模式。当我在特定对象上检索时,很少有相同的对象被检索,但是有些没有被加载。请参考以下屏幕截图。
有关模式的实现,请参考以下内容:
请参考下面的调试器视图:
上图显示该对象检索“要约”,而不是“位置”。
对于“ OfferLocation”类,请参考以下图像:
关于这种情况有什么想法吗?
答案 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时,此软件包会自动包含在内。