EF Core:如何访问多层封装的集合

Posted

技术标签:

【中文标题】EF Core:如何访问多层封装的集合【英文标题】:EF Core: How to access multi-layered encapsulated collections 【发布时间】:2018-03-27 17:47:15 【问题描述】:

根据微软 (https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-implemenation-entity-framework-core) 来封装域行为私有属性和只读集合,如下所示:

private readonly List<OrderItem> _orderItems; 
public IReadOnlyCollection<OrderItem> OrderItems => _orderItems;

您可以像这样通过封装的订单项获取订单:

public async Task<Order> GetAsync(int orderId)
    
        var order= await _context.Orders.FindAsync(orderId);
        if (order != null)
        
            await _context.Entry(order)
                .Collection(i => i.OrderItems)
                .LoadAsync();
        

        return order;
    

但是,如果订单商品本身已经封装了如下树的列表: 供应商 -> 目录 -> 目录项 如何获取 CatalogItems 集合?

【问题讨论】:

使用通常的 EF Core Include / ThenInclude?没有具体的 DDD。 好的。我只是想知道是否有 Collection() 方法的变体来完成此操作。 【参考方案1】:

您可以将 explicit loading methods Collection / Reference 与 eager loading 方法 Include / ThenIncludeQuery 方法结合使用,部分显示在 EF Core 文档的 Querying related entities 部分。

对于供应商 -> 目录 -> CatalogItems 示例,它可能是这样的:

public async Task<Supplier> GetAsync(int supplierId)

    var supplier = await _context.Suppliers.FindAsync(supplierId);
    if (supplier != null)
    
        await _context.Entry(supplier)
            .Collection(e => e.Catalogs)
            .Query() // <--
            .Include(e => e.CatalogItems) // <--
            .LoadAsync();
    
    return supplier;

【讨论】:

以上是关于EF Core:如何访问多层封装的集合的主要内容,如果未能解决你的问题,请参考以下文章

ef core 子对象集合插入顺序

EF Core Eager Loading 嵌套集合

带有 EF Core 的 ASP.NET Core - DTO 集合映射

EF Core:将元素添加到集合而不检索完整对象

EF Core:嵌套集合的过滤条件(Func<>)作为变量

EF ChangeTracker 访问被跟踪实体及其导航集合