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 CoreInclude
/ ThenInclude
?没有具体的 DDD。
好的。我只是想知道是否有 Collection() 方法的变体来完成此操作。
【参考方案1】:
您可以将 explicit loading methods Collection
/ Reference
与 eager loading 方法 Include
/ ThenInclude
到 Query
方法结合使用,部分显示在 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:如何访问多层封装的集合的主要内容,如果未能解决你的问题,请参考以下文章