Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为自己的收藏分页?_C#_Domain Driven Design_Ef Core 2.2 - Fatal编程技术网

C# 如何为自己的收藏分页?

C# 如何为自己的收藏分页?,c#,domain-driven-design,ef-core-2.2,C#,Domain Driven Design,Ef Core 2.2,假设我有一个用户域实体。我想通过(指纹)一组属性(如IP、电子邮件、电话、用户代理)来识别此用户。现在,因为根据DDD原则,指纹不能是实体,所以我将其定义为ValueObject。每次当用户尝试进行交易时,我都会查找匹配的指纹以将用户与请求关联 Ef core建议我们对ValueObjects使用OwnsMany()。我的问题是,这个拥有的实体集合会在没有任何分页的情况下立即加载。我可能每页加载100个用户,每个用户可能有数百个指纹,因为每次IP或用户代理更改时,我都必须创建一个新的指纹 我的问

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

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

我的问题是

  • 有没有办法把指纹分页?我不能这样做,因为存储库只有聚合根的约束

  • 在对象超过1k的情况下,我是否可以使用OwnsMany ValueObjects

  • 如果没有,我如何解决这个问题


  • 我不知道您的整个域模型,因此我假设
    用户
    是一个实体并包含
    指纹的集合
    是有原因的

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

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

    此解决方案可能会导致另一个问题。每次添加新的
    指纹
    ,您的
    用户
    类中都会有您不需要的冗余属性。添加新的
    指纹
    时,此属性不会自动更新。如果你觉得不舒服,我建议你把你的读写模型分开。您可以使用战术DDD模式进行保存,但简单读取可能不需要它们。

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