AddDbContext或AddDbContextPool

Mon*_*mer 27 entity-framework-core asp.net-core asp.net-core-2.0

对于Asp.net核心应用程序,我们必须使用哪一个?AddDbContext还是AddDbContextPool?根据EF Core文档,AddDbContextPool提供高性能但默认的Asp.net Core项目模板使用AddDbContext.

Gab*_*uci 42

答案就在这里(在"DbContext pooling"下):https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0#dbcontext-pooling

DbContext不是线程安全的.因此,您不能同时DbContext为多个查询重用相同的对象(奇怪的事情发生).通常的解决方案是DbContext每次需要时创建一个新对象.这是什么AddDbContext.

但是,DbContext在先前的查询已经完成之后重新使用对象没有任何问题.这是什么AddDbContextPool.它使多个DbContext对象保持活动状态并为您提供未使用的对象,而不是每次都创建一个新对象.

您使用哪一个取决于您.两者都有效.池化有一些性能提升.但是文档警告说,如果您在DbContext类中使用不应在查询之间共享的任何私有属性,则不应使用它.我想这很少见,所以在大多数情况下合并应该是合适的.

  • 内部:当“DbContext”返回到上下文池时,上下文的状态将通过调用其“IResettableService.ResetState()”方法来重置。该方法依次调用 GetResettableServices() 方法,然后在返回的对象上调用 IResettableService.ResetState() 。这些对象之一是 EF Core 提供程序“RelationalConnection”派生对象,因为它也实现了“IResettableService”。`RelationalConnection` 中 `ResetState()` 的默认实现是调用它自己的 `Dispose()` 方法,该方法又调用 `DbConnection.Dispose()`。 (11认同)
  • 返回的 DbContext 是否会在池化时保持其底层连接处于活动状态?我似乎无法在文档中找到任何线索。 (3认同)
  • 但是,SQL转换又如何呢?如果转换范围是针对每个连接的,那么连接池中的连接可能会受到影响吗? (2认同)