【发布时间】:2017-01-21 02:26:28
【问题描述】:
我有一个使用纯色图案的视觉工作室解决方案。我有一个 IRepository(Crud 实现)、IDbFactory(由存储库使用)、IUnitOfWork。我也有服务,他们使用存储库来构建自定义查询和复杂的数据库操作。我也在使用带有 Ninject 的 IoC 模式。 在 web mvc 控制器中,我只使用服务来访问数据库。 存储库接收一个 IDbFactory,它构建一个 EntityFramework 上下文。 我有一些问题:
- 在服务中,当我必须访问两个表以加入它们时,我应该使用两个存储库,调用它们的 GetAll() 方法。在这种情况下,两个存储库应共享相同的 EntityFramework 上下文。
- 上一个案例表明 DbContext 应该由所有存储库共享,因此我可以将 IQueryables 加入到来自不同存储库的服务中。
- 为了实现这个目标,我在 IoC 容器中配置了单例范围内的 DbContext。因此,每个存储库都共享相同的 DbContext。
- 此解决方案的问题是 DbContext 有缓存。因此,当外部进程(不同于 Web 项目)更改我的数据时,DbContext 不会意识到这一点,并且 Web 项目有时不会显示真实数据。
- 我阅读了关于在每个存储库调用中销毁 DbContext,但我不能这样做,因为每个存储库都应该使用相同的 DbContext
我的项目结构有问题吗?这是我必须在存储库层解决的问题?我该怎么办?该项目处于开发阶段,因此我可以更改数据访问架构。我喜欢在控制器中使用 IQueryables,以便用户在数据网格中过滤产生 sql 查询。
【问题讨论】:
-
CodeReview 为这类问题提供了一个更好的论坛。例如:codereview.stackexchange.com/questions/11785/…
-
这是一个典型的例子,说明为什么构建 IRepository 通常是浪费时间。 EF 已经实现了存储库和工作单元并抽象了数据库,所以现在您已经在顶部删除了另一层抽象来实现什么?等到您开始将内容保存在一个存储库中,它会将更改保存在另一个存储库中,因为这些对象附加到相同的上下文中。如果您在网站或服务之类的地方,您可以使 DbContext 每个请求的生命周期,但 IRepository 通常比它的价值更麻烦,
-
另一个问题是你的 DbContext 是一个单例。这意味着每个用户都在运行相同的 DbContext。破坏了 DBContext 中固有的工作单元。您希望为每个工作单元创建一个 dbcontext。
标签: .net asp.net-mvc entity-framework repository-pattern solid-principles