首页 > 解决方案 > 如何对OwnsMany 集合进行分页?

问题描述

考虑我有一个用户的域实体。我想通过(指纹)一组属性来识别这个用户,例如 IP、电子邮件、电话、用户代理。现在由于根据 DDD 原则,指纹不能是实体,所以我将其定义为 ValueObject。每次当用户尝试进行交易时,我都会查找匹配的指纹以将用户与请求相关联。

Ef core 建议我们使用OwnsMany()for ValueObjects。我的问题是这个拥有实体的集合会立即加载而没有任何分页。我可能每页加载 100 个用户,每个用户可能有数百个指纹,因为每次 IP 或用户代理更改时,我都必须创建一个新用户。

我的问题是

  1. 有没有办法对这些指纹进行分页?我做不到,因为存储库仅对聚合根有限制。

  2. 我可以在对象超过 1k 的情况下实际使用 OwnsMany ValueObjects 吗?

  3. 如果没有,我该如何解决这个问题?

标签: c#domain-driven-designef-core-2.2

解决方案


我不知道你的整个域模型,所以我认为它是User一个实体并包含一个集合是有原因的Fingerprints

每次当用户尝试进行交易时,我都会查找匹配的指纹以将用户与请求相关联。

您不应该将数据库中的所有记录都加载到应用程序内存中。据我了解,您User在进行交易时真正需要的不是所有指纹,而只是匹配的指纹。一个解决方案是在从数据库加载对象时正确准备对象。不要加载所有的Fingerprints,而只加载你感兴趣的。你可以在你的 User 类中为它创建另一个属性。在基础架构层中编写 Linq 查询或 SQL 选择。

此解决方案可能会导致另一个问题。每次添加新的Fingerprint时,您的User类中都会有您不需要的冗余属性。添加 newFingerprint时,此属性不会自动更新。如果您对此感到不舒服,我建议您将读写模型分开。您可以使用 Tactical DDD 模式进行保存,但可能不需要它们进行简单读取。


推荐阅读