没有存储库模式的实体框架中的存储过程

时间:2016-05-07 00:34:44

标签: c# sql entity-framework linq repository-pattern

我在存储库模式和实体框架之间有点混淆。

this answer中,我了解到,由于以下原因,在Entity Framework上创建存储库是不好的:

  • EF实施UnitOfWork
  • EF实现通用存储库
  • Repository模式用于抽象数据库远离业务逻辑,实体框架

我们应该使用服务,而不是在EF之上创建存储库。

现在出现问题:

什么是,如果我决定性能原因用存储过程调用替换一些Linq查询,如mentioned here?这个答案建议使用某种存储库模式。

如果我直接在服务层调用存储过程,那会感觉很脏,因为数据库将不再从业务逻辑中抽象出来。

如何抽象存储过程调用?或者可以从服务层调用它吗?

1 个答案:

答案 0 :(得分:1)

在EF之上拥有回购的原因是,在许多情况下,开发人员还会暴露IQueryable,这会破坏模式的目的。您当然可以使用EF作为内部实现详细信息的存储库(即服务,顺便说一句)。

Repository和EF之间的关系是Repository可能使用EF,但客户端(使用repo)不应该知道这一点。 EF 是一个存储库,虽然它可以作为一个存储库使用,但是另一个开发人员却忽视了这一点。

可以直接在CRUD应用中使用EF,而不会假装您使用存储库模式,这些应用并不真正需要它。

在您的情况下,存储库实现应允许您根据自己的需要进行更改,因为界面不应受到影响;这就是存储库接口仅适用于业务模型定义的业务对象的原因。

在正确的架构中,您不会直接执行linq或调用SProcs,因为这些是持久层细节。应用程序的其余部分并不了解它们。您可以将存储库,查询服务等与调用层已知的概念(业务对象,视图模型,读取模型)一起工作(作为接口),并且只有那些服务'实施了解EF或SPRocs。