C# 每次创建不同的数据库上下文而不使用

C# 每次创建不同的数据库上下文而不使用,c#,asp.net,database,database-connection,idisposable,C#,Asp.net,Database,Database Connection,Idisposable,那么,我想知道使用下面的方法可能会遇到什么问题 CreateContextFactory().Create().QueryOpenConnectionCount(); 而不是: using (var context = CreateContextFactory().Create()) { openConnectionCount = context.QueryOpenConnectionCount(); } return openConnectionCount; 如果有什么问题,比

那么,我想知道使用下面的方法可能会遇到什么问题

CreateContextFactory().Create().QueryOpenConnectionCount();
而不是:

using (var context = CreateContextFactory().Create())
{
      openConnectionCount = context.QueryOpenConnectionCount();
}
return openConnectionCount;
如果有什么问题,比如:

CreateContextFactory().Create().QueryOpenConnectionCount1();
CreateContextFactory().Create().QueryOpenConnectionCount2();
CreateContextFactory().Create().QueryOpenConnectionCount3();
这是因为我在一个类中有一些方法是开放的db上下文,如上所述,我可以为它们创建一个using语句,但是我需要为所有方法传递上下文,并且我还需要重构一个使用db上下文执行事务的帮助器(因为它在内部创建自己的上下文)。那么,让代码保持这种状态有什么问题呢?

通常,数据上下文“拥有”一个连接,以避免不断地从池中获取一个连接并初始化它。处理数据上下文通常会处理该连接

因此:如果您继续创建数据上下文而没有正确地处理它们,那么您正在流失连接,至少在GC介入并撤消混乱之前(如果存在非托管部分,则将连接的非托管部分释放回非托管池)

这是一件坏事,严重限制了可伸缩性,并增加了到数据库服务器的打开连接数。因此,是的,您应该处理数据上下文。扩展到一般情况:当你处理完所有你负责的
IDisposable
东西后,你就可以处理掉它。可能有一些例外(
HttpClient
DataTable
,等等)

请注意,如果您使用的
语句到达当前范围的末尾(即下一个
}
),C#8对此有一个稍微简洁的语法(我会说“nicer”,但这是主观的;我非常喜欢它):

使用var context=CreateContextFactory().Create();
返回context.QueryOpenConnectionCount();
或者,即使使用早期的C#,您也可以使其更简单,并删除本地:

使用(var context=CreateContextFactory().Create())
{
返回context.QueryOpenConnectionCount();
}

是的,有一个问题,请研究一下一次性模式,以及为什么使用它