在 EF Core 7
DbContext
课程中,在 UpdateNavigationLoading
中,我有一些 AutoInclude
调用:
private static void UpdateNavigationLoading(ModelBuilder modelBuilder){
{
modelBuilder.Entity<Order>()
.Navigation(order => order.OrderItems)
.AutoInclude();
modelBuilder.Entity<OrderItem>()
.Navigation(orderItem => orderItem.Item)
.AutoInclude();
// ... etc
}
但在我的一个 API 调用中,我不希望包含要与任何
Item
记录一起返回的 OrderItem
实体。
在基础服务中,我最终基本上结束于:
return context.Set<Order>().AsQueryable();
除此之外,对于从
IQueryable
返回的 AsQueryable()
,我添加了一些 where 子句等,例如:
if (StartDate.HasValue)
{
query = query.Where(item => item.Created >= filter.StartDate);
}
或添加限制:
if (Limit.HasValue)
{
query = query.Take(Limit.Value);
}
我相信你可以想象更多..
但是由于
modelbuilder UpdateNavigationLoading
调用中的内容,OrderItem
的 Item
实体会自动包含在内。
在不更改
UpdateNavigationLoading
调用的情况下,有没有办法可以指示或要求 API 服务级别的 DbContext
不 尊重 AutoInclude
的 OrderItem.Item
?
所以在我的电话中
context.Set<Order>().AsQueryable();
或者在调用之前,我可以在
DbContext
中设置一些内容来执行我需要的操作吗?
在 EF Core 7 中,没有直接的内置功能可以在 API 服务级别忽略或禁用特定自动包含的实体,而无需修改
UpdateNavigationLoading
方法。但是,您可以通过组合使用 Include
和 IgnoreAutoIncludes
方法来实现所需的行为。
以下示例说明了如何修改 API 服务代码以排除
Item
实体自动包含在 OrderItem
中:
using Microsoft.EntityFrameworkCore;
// ...
public IQueryable<Order> GetOrders(DbContext context, DateTime? startDate, int? limit)
{
var query = context.Set<Order>().AsQueryable();
// Apply custom filters
if (startDate.HasValue)
{
query = query.Where(item => item.Created >= startDate);
}
if (limit.HasValue)
{
query = query.Take(limit.Value);
}
// Disable auto-includes temporarily
query = query.IgnoreAutoIncludes();
// Include only necessary entities
query = query.Include(order => order.OrderItems).ThenInclude(orderItem => orderItem.PropertyA)
// Add more includes if needed
// .Include(order => order.OtherEntity)
return query;
}
在上面的代码中,我们首先在
IgnoreAutoIncludes
对象上调用 IQueryable<Order>
来禁用后续查询的自动包含。然后,我们使用 Include
方法显式指定要包含的实体。通过不包含 Item
实体,在获取 OrderItem
记录时不会自动包含该实体。
请记住根据您的实体结构和关系调整
Include
调用。
注意:
IgnoreAutoIncludes
方法在 EF Core 5 或更早版本中不可用。它是在 EF Core 6 中引入的。因此,如果您使用的是旧版本,此方法将不起作用,您可能需要修改 UpdateNavigationLoading
方法或考虑其他替代方案。