要求 EF Core DBContext 忽略某些自动包含实体的 API?

问题描述 投票:0回答:1

在 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
中设置一些内容来执行我需要的操作吗?

c# entity-framework-core dbcontext
1个回答
4
投票

在 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
方法或考虑其他替代方案。

© www.soinside.com 2019 - 2024. All rights reserved.