.net 基于实体框架的应用程序的SQL Server进程过多
我们目前正在开发一个基于WPF/实体框架的应用程序。我们的要求之一是允许用户选择登录时要连接到的环境(测试、培训或生产)。每个连接选项都指向自己的数据库。为了做到这一点,我们通过以下方式创建新的EF上下文:.net 基于实体框架的应用程序的SQL Server进程过多,.net,sql-server,vb.net,entity-framework,.net,Sql Server,Vb.net,Entity Framework,我们目前正在开发一个基于WPF/实体框架的应用程序。我们的要求之一是允许用户选择登录时要连接到的环境(测试、培训或生产)。每个连接选项都指向自己的数据库。为了做到这一点,我们通过以下方式创建新的EF上下文: Public Function NewVectorContext() As VectorEntities Dim strDBConn As String = "metadata=res://*/EntityFramework.VectorModel.csdl|res://*/Enti
Public Function NewVectorContext() As VectorEntities
Dim strDBConn As String = "metadata=res://*/EntityFramework.VectorModel.csdl|res://*/EntityFramework.VectorModel.ssdl|res://*/EntityFramework.VectorModel.msl;provider=System.Data.SqlClient;provider connection string=""" & VectorConnectionString & """"
Dim EntityConn As System.Data.EntityClient.EntityConnection = New System.Data.EntityClient.EntityConnection(strDBConn)
Dim MyNewContext as VectorEntities = New VectorEntities(EntityConn)
MyNewContext.ContextOptions.LazyLoadingEnabled = False
Return MyNewContext
End Function
VectorConnectionString以标准SQL Server方式格式化:
Data Source=OurDBServer;Initial Catalog=OurAppDB;Persist Security Info=True;User ID=OurUserId;Password=OurPassword
在运行时由用户选择(测试、培训、产品)确定
我们已经确保,一旦它的工作完成,所有新的上下文都会被处理掉
问题在于:当用户使用该应用程序时,我们在SQLServer的活动监视器中看到数百个SQLServer进程。一些个人用户在使用该应用程序时有30多个相关流程。一旦用户关闭应用程序,相关的进程都会消失-但是当应用程序运行时,这些进程似乎会继续存在。修复-正如我上面提到的,解决方案的一部分是正确的内存管理,并确保所有模型和viewmodels都被正确处理。但这只消除了我们看到的一小部分sql server进程。罪魁祸首是设计不当的模型基类,该基类为每个实例化的模型创建了多个上下文。一旦它被改写,问题就解决了。与EF无关。问题半修复:我们的viewmodels和models并非总是被正确处理,碎片显然仍然留在内存中,这表明SQL Server Activity monitor中有大量进程。通过适当的处理,我们可以看到创建的sql server进程越来越少,但仍有大量进程被创建-这正常吗?