Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core AddDbContext或AddDbContextPool_Asp.net Core_Entity Framework Core_Asp.net Core 2.0 - Fatal编程技术网

Asp.net core AddDbContext或AddDbContextPool

Asp.net core AddDbContext或AddDbContextPool,asp.net-core,entity-framework-core,asp.net-core-2.0,Asp.net Core,Entity Framework Core,Asp.net Core 2.0,对于Asp.net核心应用程序,我们必须使用哪一个AddDbContext或AddDbContextPool?根据EF核心文档,AddDbContextPool提供了高性能,但默认的Asp.net核心项目模板使用AddDbContext 答案在这里(在“DbContext池”下): DbContext不是线程安全的。因此,不能将同一个DbContext对象同时用于多个查询(奇怪的事情会发生)。通常的解决方案是每次需要时创建一个新的DbContext对象。这就是AddDbContext所做的 但是

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

答案在这里(在“DbContext池”下):

DbContext
不是线程安全的。因此,不能将同一个
DbContext
对象同时用于多个查询(奇怪的事情会发生)。通常的解决方案是每次需要时创建一个新的
DbContext
对象。这就是
AddDbContext
所做的

但是,在上一个查询已经完成之后重用
DbContext
对象并没有什么错。这就是
AddDbContextPool
所做的。它使多个
DbContext
对象保持活动状态,并提供一个未使用的对象,而不是每次创建一个新对象


你用哪一个取决于你自己。两者都会起作用。池有一些性能提升。但是,文档警告说,如果在
DbContext
类中使用任何不应在查询之间共享的私有属性,则不应使用它。我想这是非常罕见的,所以池在大多数情况下应该是合适的。

除非您需要高性能,否则您不需要
AddDbContextPool
。高性能意味着每秒2000-5000个请求(每台运行应用程序的机器)。每分钟100个请求不是高性能,您对defaults@Tseng实际上怎么样@Gabriel的回答提到必须为并行查询创建新的
DbContext
AddDbContextPool
是否会更简单,因为它会自动执行此操作?有什么不好的地方吗?@Jeppe我有点晚了,但是池对并行查询没有任何帮助。无论您是否使用池,依赖项注入中每个作用域仍然只提供一个
DbContext
?如果Transactions作用域为“每个连接”,则连接池中的会受到影响吗?问题是它会为对
SaveChanges()
的每次调用创建一个事务,并自动关闭它。因此,只有在手动创建事务而不关闭事务时,这才可能是一个问题。返回的DbContext会在池中保持其底层连接的活动性吗?我在文档中似乎找不到任何线索。@djsoteric如果您正在处理该属性的重置,那么是的,只要您在需要时正确重置它,您就可以了。内部:当
DbContext
返回到上下文池时,通过调用其
IResettableService.ResetState重置上下文的状态()
method。此方法依次调用
GetResettableServices()
方法,然后调用
IResettableService.ResetState()
返回的对象。其中一个对象是EF核心提供者
RelationalConnection
派生对象,因为它也实现了
IResettableService
RelationalConnection
中的
ResetState()
的默认实现是调用自己的
Dispose()
方法,该方法依次调用
DbConnection.Dispose()