我一直在WPF数据库转换应用中使用Entity Framework。我接近发布应用程序,但有一件事总是让我感到烦恼 - 数据库上下文在我第一次尝试时总是失败。
这是我得到的错误:
System.Data.SqlClient.SqlException(0x80131904):建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)
我知道实例是可访问的,因为我正在运行其他东西(并且它在所有后续尝试中连接都很好)。所以它必须在我的配置中。
我有一个应用程序的默认app.config(如果不存在)。使用该应用程序,用户连接到他们的数据库实例,并使用ConfigurationManager类将其设置保存到配置文件。在保存连接字符串之前,我不进行任何上下文调用。
示例app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ImportUser" value="Admin" />
</appSettings>
<connectionStrings>
<add name="RockContext" connectionString="Data Source=localhost;
Initial Catalog=RockChMS;Integrated Security=True;
MultipleActiveResultSets=True;Connection Timeout=15"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
EF将连接:
有没有办法在程序启动后强制EF使用正确的连接字符串重新加载/刷新?在保存修改后的连接字符串之前,我不会使用上下文调用任何内容。< / p>
答案 0 :(得分:1)
无法强制EF重新加载配置。但是如果你有正确的连接字符串 您可以使用ObjectContext构造函数的重载版本,该构造函数将连接字符串作为参数。例如,如果BuroDBEntities - 我的对象上下文类(公共部分类BuroDBEntities:ObjectContext {...}):
private BuroDBEntities Context = new BuroDBEntities(); //will use connection string from app configuration file
private BuroDBEntities Context = new BuroDBEntities(MyConnectionString); //will use connection string from parameter
答案 1 :(得分:0)
在我的db对象类中添加构造函数后,我意识到在刷新配置时我没有检查正确的部分。 ConfigurationManager.RefreshSection
方法区分大小写,如果不匹配则不会抛出错误。
现在我可以在访问DBContext
之前保存配置并刷新它:
appConfig.Save( ConfigurationSaveMode.Modified );
ConfigurationManager.RefreshSection( "connectionStrings" );