Entity framework 实体框架6,我应该使用存储库模式吗?

Entity framework 实体框架6,我应该使用存储库模式吗?,entity-framework,entity-framework-6,repository-pattern,Entity Framework,Entity Framework 6,Repository Pattern,我对实体框架很陌生,仍然在努力解决它。这么多不同的例子和解释,我不知道该怎么做 我有几个问题: 在我当前的应用程序中,我使用的模式包括: 存储库模式 (在顶部)工作单元 对于每个from,我都会声明一个新的工作单元。因此,当我进行Savechanges时,只有相关的项会受到影响 对于复杂的业务逻辑,我在存储库中为每个类编写方法 例如: 一种方法是:从一个库存位置移除一个项目,将其移动到另一个位置,然后减少旧位置的数量,等等。。。 -或者更复杂的作业,从不同的表读取数据并写入多个表 但最近

我对实体框架很陌生,仍然在努力解决它。这么多不同的例子和解释,我不知道该怎么做

我有几个问题:

在我当前的应用程序中,我使用的模式包括:

  • 存储库模式
  • (在顶部)工作单元
对于每个from,我都会声明一个新的工作单元。因此,当我进行Savechanges时,只有相关的项会受到影响

对于复杂的业务逻辑,我在存储库中为每个类编写方法 例如:

  • 一种方法是:从一个库存位置移除一个项目,将其移动到另一个位置,然后减少旧位置的数量,等等。。。 -或者更复杂的作业,从不同的表读取数据并写入多个表
但最近我发现,通过Entity Framework 6.0:

  • DbContext=工作单元
  • DbSet相当于存储库
  • 因此,问题是:

  • 我应该使用一个DBCONTEXT,还是为每个表单/操作声明一个新的DBCONTEXT,以便事务保持在本地上下文(表单/操作)中=
  • 我将如何替换存储库中的方法

  • 谢谢

    首先,尝试将DbContext视为单例对象是个坏主意,因为您无法在操作中管理事务。您必须为每个操作实例化DbContext

    第二,尝试将“数据层关注点”与“业务关注点”分开。例如:

    一种方法是:从一个库存位置移除一个项目,将其移动到另一个位置,然后减少旧位置的数量


    我认为您正在为每个用例编写存储库方法,这不是数据层的问题。您的存储库只需要了解对象的持久化和检索。从另一个角度讲,您的存储库方法只是CRUD方法。您的业务层将使用此方法执行业务逻辑。

    DbSet不是存储库,除非我们的域对象可以由EF“按原样”使用。即使如此,它公开IQueryable的事实也违背了存储库模式的目的。简而言之,存储库是一个原则,它的实现不是DbSet,但实现可以使用EF作为内部细节。谢谢,这是我错的一点,很抱歉显示了co正确的路径。感谢Hadi给出了一个微妙的答案。关于DbContext,我还感觉每次都需要单独的DbContext,因为交易。关于第二个问题,你是说,我应该保留我的回购协议,并在其中编写业务逻辑方法?你能亲自给我看一个concerte示例代码吗根据经验,使用DbContext的最佳实践是每次在操作中实例化它(不要忘记使用“Using”块以避免内存泄漏)。关于第二个问题,我的意思是,您不应该在存储库中编写业务逻辑。例如,您应该只使用simple Update()方法,然后您的业务逻辑方法将使用此更新“从一个位置移动库存”[link]抱歉,我的上一条评论中有一个问题,现在它不允许我编辑它。正确链接:谢谢hadi,在检查链接并重新阅读您的回复后,这会更有意义,