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));
我正在开发基于 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));