【问题标题】:How to paginate OwnsMany collections?如何对OwnsMany 集合进行分页?
【发布时间】:2019-09-16 11:33:01
【问题描述】:

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

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

我的问题是

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

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

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

【问题讨论】:

  • OwnsMany() 不适用于 ValueObjects。它用于聚合——应该以原子方式加载和保存的实体图。

标签: c# domain-driven-design ef-core-2.2


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-04-18
    • 2015-09-30
    • 2018-05-10
    • 2017-05-03
    • 2010-09-05
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多