实体框架是存储库吗

时间:2019-12-04 08:06:02

标签: c# entity-framework repository-pattern

就应用程序层而言,我很难弄清楚如何放置实体框架DbContext。在我看来,它旨在替换存储库层,但另一方面,它实际上并不像更基本的存储库那样工作,后者是通过接口实现的,因此以后可以轻松交换。

因此,我在 service 存储库层(例如this post)上找到了很多不错的帖子,但似乎无法回答实体的位置框架适合这种模式。

我应该在实体框架之上添加存储库层还是在服务中使用DbContext代替存储库?

2 个答案:

答案 0 :(得分:2)

您需要问自己为什么要抽象化数据访问层。

答案通常是:

  • 单元测试
  • 用另一种数据库/持久性技术替换该层

许多人认为第二个参数完全是错误的,因为:

  • 替换该层通常比配置另一个实现对您的应用程序影响更大
  • 这种情况很少发生,不值得付出努力

总而言之,我倾向于同意 testability 应该是您的主要关注点,对于EntityFramework,您可以:

  • 使用EF Core及其内置的InMemory provider
  • 在上下文中使用EF 6和mock所有方法和DbSet(通过将它们标记为virtual)。

然后,回答您的问题标题:是的。 DbContext 已经充当存储库。

答案 1 :(得分:1)

EF不是一层,它是一种数据访问技术。

EF调用应该写在存储库中,该存储库是对服务层的抽象,因此服务层不必关心数据是存储在数据库中还是其他地方。