【问题标题】:EF Core: How to access multi-layered encapsulated collectionsEF Core:如何访问多层封装的集合
【发布时间】: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() 方法的变体来完成此操作。

标签: c# entity-framework-core


【解决方案1】:

您可以将 explicit loading methods Collection / Referenceeager 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多