42

根据MSDNDbContext定义为:

表示工作单元和存储库模式的组合,使您能够查询数据库并将更改组合在一起,然后将这些更改作为一个单元写回存储。

既然DbContext实现了工作单元和存储库模式,那么为什么我在 Internet 上找到的这个ASP.NET 教程DbContext和其他资源演示了如何使用工作单元和存储库模式的自定义实现?这不是多余的吗?

如果不是,那么在使用时创建工作单元和存储库层的自定义实现有什么好处DbContext?(我可以看到这在测试项目中是如何有意义的。)

4

2 回答 2

74

是的,DbContext代表一个工作单元并DbSet代表一个存储库,但是有些人会在它们之上创建一个抽象层。以下是人们可能这样做的一些原因:

  • 也许他们不希望他们的项目与实体框架及其架构紧密耦合。因此,他们将实体框架隐藏在这些抽象背后,以便他们可以用实体框架替换任何其他 ORM,而无需对数据访问层的接口进行任何修改。
  • 他们使用存储库来明确某些实体允许哪些操作。(例如,CustomerRepository可能允许添加和更新客户,但不允许删除他们)。另一方面,它使客户端开发人员能够轻松识别某些实体的可用操作。换句话说,他们创建具有与领域语言兼容的命名约定和接口的存储库。
  • 将与数据库相关的操作移动到存储库允许您拦截这些操作并执行日志记录、性能调整或任何其他您想要的操作。
  • 有些人这样做是为了使测试更容易。假设我有一个ICustomerRepository包含三种方法的接口。然后我可以轻松地模拟它,而不是IDbSet<Customer>用太多的方法来模拟。
  • 最后,有许多人没有DbContext在和上创建抽象DbSet。他们只是直接使用它们,这样做是完全有效的。
于 2013-06-30T14:26:08.810 回答
3

我知道为时已晚

对于工作单元:当您将数据拉入和拉出数据库时,跟踪您所做的更改非常重要。同样,您必须插入您创建的新对象并删除您删除的任何对象。

您可以在每次更改对象模型时更改数据库,但这会导致大量非常小的数据库调用。

工作单元跟踪您在可能影响数据库的业务事务期间所做的一切。

对于存储库模式:它是与数据库隔离的业务域。

阅读本书 (PEAA)

于 2017-11-21T08:23:54.940 回答