C# 如何停止Visual Studio 2015在项目加载时连接到每个连接字符串?
当试图打开包含大量连接字符串的解决方案时,Visual Studio 2015会在加载项目时尝试连接到每个字符串 我们团队中的每个开发人员在开发过程中都使用SQL Server的本地实例。这个实例可以有主数据库的多个副本,其中包括不同级别的迁移—我们是一个小团队,所以通常会中途切换任务 为此,我们有许多特定于机器的连接字符串,在创建DbContext时,我们使用机器名称来确定要使用的连接字符串:C# 如何停止Visual Studio 2015在项目加载时连接到每个连接字符串?,c#,entity-framework,visual-studio-2015,C#,Entity Framework,Visual Studio 2015,当试图打开包含大量连接字符串的解决方案时,Visual Studio 2015会在加载项目时尝试连接到每个字符串 我们团队中的每个开发人员在开发过程中都使用SQL Server的本地实例。这个实例可以有主数据库的多个副本,其中包括不同级别的迁移—我们是一个小团队,所以通常会中途切换任务 为此,我们有许多特定于机器的连接字符串,在创建DbContext时,我们使用机器名称来确定要使用的连接字符串: <connectionStrings> <!-- Steve -->
<connectionStrings>
<!-- Steve -->
<add name="MachineConnection_LT4" providerName="System.Data.SqlClient"
connectionString="Data Source=LT4\SQL2012;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx;MultipleActiveResultSets=True" />
<!-- Sean -->
<add name="MachineConnection_DESKTOP-UQV58RL" providerName="System.Data.SqlClient"
connectionString="Data Source=DESKTOP-UQV58RL\SQLEXPRESS;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx;MultipleActiveResultSets=True" />
<!-- Sarah -->
<add name="MachineConnection_Dev-3" providerName="System.Data.SqlClient"
connectionString="Data Source=Dev-3\;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx;MultipleActiveResultSets=True" />
<!-- Graham -->
<add name="MachineConnection_lt5" providerName="System.Data.SqlClient"
connectionString="Data Source=.;Initial Catalog=xxx;Integrated Security=True;MultipleActiveResultSets=True" />
<add name="MachineConnection_graham-surface3" providerName="System.Data.SqlClient"
connectionString="Data Source=.;Initial Catalog=xxx;Integrated Security=True;MultipleActiveResultSets=True" />
<add name="MachineConnection_graham-pc-10" providerName="System.Data.SqlClient"
connectionString="Data Source=.;Initial Catalog=xxx;Integrated Security=True;MultipleActiveResultSets=True" />
<!-- Alex -->
<add name="MachineConnection_Dev9" providerName="System.Data.SqlClient"
connectionString="Data Source=Dev9;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx;MultipleActiveResultSets=True" />
<!-- Reuben -->
<add name="MachineConnection_ReubenPC" providerName="System.Data.SqlClient"
connectionString="Data Source=REUBENPC\SQLEXPRESS;Initial Catalog=xxx;Integrated Security=True;MultipleActiveResultSets=True" />
</connectionStrings>
并以此来帮助:
public class SqlConnections
{
private const string DefaultConnectionStringName = "DefaultConnection";
/// <summary>
/// Get the name of the connection string to use.
/// This attempts to find a machine-specific connection string e.g. MachineConnection_LT4, and falls back to
/// the default connection string if a machine-specific connection string is not found
/// </summary>
/// <returns></returns>
public static string GetConnectionStringName()
{
// This enables a connection string to be completely overridden in the cloud service configuration
try
{
var cloudConnectionString = CloudConfigurationManager.GetSetting("TTDatabaseConnectionString");
if (!String.IsNullOrEmpty(cloudConnectionString)) return cloudConnectionString;
}
catch
{
// Deliberately empty - an exception will be thrown if not running on AppFabric
}
string machineSpecificConnectionStringName = string.Format("MachineConnection_{0}", Environment.MachineName);
string connectionString = ConfigurationManager.ConnectionStrings[machineSpecificConnectionStringName] == null
? DefaultConnectionStringName
: machineSpecificConnectionStringName;
return connectionString;
}
}
公共类SqlConnections
{
私有常量字符串DefaultConnectionString=“DefaultConnection”;
///
///获取要使用的连接字符串的名称。
///这将尝试查找特定于机器的连接字符串,例如MachineConnection_LT4,然后返回到
///如果找不到特定于计算机的连接字符串,则为默认连接字符串
///
///
公共静态字符串GetConnectionStringName()
{
//这使得连接字符串能够在云服务配置中被完全覆盖
尝试
{
var cloudConnectionString=CloudConfigurationManager.GetSetting(“TTDatabaseConnectionString”);
如果(!String.IsNullOrEmpty(cloudConnectionString))返回cloudConnectionString;
}
抓住
{
//故意清空-如果未在AppFabric上运行,将引发异常
}
string MachineSpecificConnectionString=string.Format(“MachineConnection_{0}”,Environment.MachineName);
string connectionString=ConfigurationManager.connectionString[MachineSpecificationConnectionString]==null
?默认连接字符串名称
:机器专用连接字符串名称;
返回连接字符串;
}
}
当Visual Studio 2015加载项目时(初始加载或更改Git分支时),它会尝试建立到列表中指定的每个连接字符串的连接(通过删除除1个以外的所有连接字符串来确认),并且由于它们都是每个相关机器的本地连接,因此它会停止响应,直到连接超时,抛出以下错误:
Visual Studio 2013对此设置没有问题。有没有办法说服Visual Studio 2015以同样的方式运行?这是由一个扩展引起的,特别是Karma测试适配器(版本1.1.3),它似乎会在项目加载时自动运行一些代码
禁用此扩展解决了问题。很难相信Visual Studio 2015会做出如此愚蠢的事情。非常糟糕的设计。这应该发送给VS团队,以便在将来的版本中进行解释和修复。奇怪的行为。但无法复制它。我复制了你的一个连接字符串,但当我重新打开项目时,它没有尝试连接并超时。只有当我在服务器资源管理器中手动单击“刷新”时,才会发生这种情况。也许有一些外部插件强制自动刷新?谢谢@VolkanPaksoy-当更改分支和VS重新加载项目时,它似乎更普遍。只是在再次加载之前尝试确保服务器资源管理器窗口已关闭并重新启动,但仍然会发生这种情况-服务器资源管理器随后会在每个连接旁边显示一个红色的“X”,因此它显然正在尝试连接,并意识到连接不可用。接下来我将尝试禁用所有插件,看看这是否会改变什么。。。
public class SqlConnections
{
private const string DefaultConnectionStringName = "DefaultConnection";
/// <summary>
/// Get the name of the connection string to use.
/// This attempts to find a machine-specific connection string e.g. MachineConnection_LT4, and falls back to
/// the default connection string if a machine-specific connection string is not found
/// </summary>
/// <returns></returns>
public static string GetConnectionStringName()
{
// This enables a connection string to be completely overridden in the cloud service configuration
try
{
var cloudConnectionString = CloudConfigurationManager.GetSetting("TTDatabaseConnectionString");
if (!String.IsNullOrEmpty(cloudConnectionString)) return cloudConnectionString;
}
catch
{
// Deliberately empty - an exception will be thrown if not running on AppFabric
}
string machineSpecificConnectionStringName = string.Format("MachineConnection_{0}", Environment.MachineName);
string connectionString = ConfigurationManager.ConnectionStrings[machineSpecificConnectionStringName] == null
? DefaultConnectionStringName
: machineSpecificConnectionStringName;
return connectionString;
}
}