Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Asp.net mvc 存储库模式-如何正确处理连接和复杂查询?_Asp.net Mvc_Entity Framework_Design Patterns_Domain Driven Design_Repository Pattern - Fatal编程技术网

Asp.net mvc 存储库模式-如何正确处理连接和复杂查询?

Asp.net mvc 存储库模式-如何正确处理连接和复杂查询?,asp.net-mvc,entity-framework,design-patterns,domain-driven-design,repository-pattern,Asp.net Mvc,Entity Framework,Design Patterns,Domain Driven Design,Repository Pattern,我对存储库模式有一个问题——如何在多个存储库之间执行连接操作。在这个项目中,我们使用MVC、EF、DDD。我知道这类问题在这里已经出现过好几次了,我在这一次后面会提到这些问题 在通用知识库模型(iRealStand)和特定的存储库模型之间,我选择了特定的选项,因为我认为ORM(在我们的例子中是EF)本身是一个通用的存储库模式,所以添加另一个通用库是没有意义的,我们宁愿将知识库定制成域需求。 问题是我有几个(~10)个表,每个表都有许多行(数百万),我需要执行连接,因此使用IList或IEnume

我对存储库模式有一个问题——如何在多个存储库之间执行连接操作。在这个项目中,我们使用MVC、EF、DDD。我知道这类问题在这里已经出现过好几次了,我在这一次后面会提到这些问题

在通用知识库模型(iRealStand)和特定的存储库模型之间,我选择了特定的选项,因为我认为ORM(在我们的例子中是EF)本身是一个通用的存储库模式,所以添加另一个通用库是没有意义的,我们宁愿将知识库定制成域需求。 问题是我有几个(~10)个表,每个表都有许多行(数百万),我需要执行连接,因此使用IList或IEnumerable是不可行的选择

我的理解(以及我的观点)是IQueryable不应该离开存储库(“DAL中发生的事情应该留在DAL中”)。公开IQueryable并在LINQIn服务中使用它会简单得多,但它严重违反了关注点分离并破坏了存储库的作用——在这种情况下,服务将和存储库做同样的事情。以下几篇文章支持这一观点(或者更确切地说是信念):

也有类似的问题和解决方案,例如,建议.Include(),但这不是重载表和跨多个表的联接的选项-对于每个联接,我们使用子选择来限制实际联接的内容)

这个问题(答案和评论)——基本上建议了基于任务的区别:为带有连接的查询创建一个存储库,并为每个实体的操作创建“常规”存储库

我看到我们有以下选择:

  • 在服务中公开IQueryable并执行JOIN复杂查询;我真的觉得这是反模式的,我不喜欢这样
  • 不要对这10个表使用存储库,在服务中执行查询;一些文章建议使用EF就足够了(例如),我不同意这一点
  • 使用基于任务的区分,不要将存储库限制为1:1 repo:entity(我赞成这个选项)
  • 完全不同的东西
  • 那么-你有什么建议?一次又一次,谢谢你

  • 意味着将持久性泄漏到应用程序-反模式、意大利面代码中
  • 它与(1)到底有什么不同?还是一样的问题
  • 再近一点
  • 使用查询对象模式。将复杂查询封装在存储库旁边的基于任务的对象中。它可以返回针对视图而不是域对象优化的DTO
  • 严重依赖QO将导致您采用一种称为CQRS-命令查询责任分离的体系结构

  • 还有一件事。实体:回购不存在1:1匹配。只有聚合应该有一个存储库,而不是每个实体。

    存储库的处理要点是将数据库全部忽略。数据库引擎、表、sql、连接等是存储库的实现细节,它们永远不会超过持久性边界。因此,应用程序从不知道EF或JOIN,也从不直接访问数据库。该应用程序只知道存储库,它告诉它做什么/得到什么,而不告诉它如何做I I Robert,我正在努力解决同样的问题。到目前为止,我的发现让我得出了与你的选择相同的结论。您最终会选择哪种方法?为什么?您好,对于复杂查询,我们只使用一些特定的存储库进行查询,在我们的例子中,这些存储库中的查询通常由存储过程执行,这些存储过程返回多个记录集(当联接不够时),存储库将其转换为特定的(通常是复杂的)域对象(它本身不是实体,但我相信它仍然不是DDD的滥用)?例如GetOrderLineByOrderId或GetOrderLineByCustomerId对于标准查询,我们在聚合根和EF6周围使用普通存储库,在前面提到的情况下,它类似于处理订单域的OrderRepository。