2014-10-07 45 views
0

我一直在WPF数据库转换应用程序中使用实体框架。我接近发布应用程序,但有一件事总是给我留下了深刻的印象 - DB环境总是在我第一次尝试时失败。WPF应用程序:实体框架连接第一次失败

这里是我的错误:我知道实例是可访问的,因为我运行其他的东西给它(和它连接就好了所有后续尝试)

System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to 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将连接:

  • 一旦我使用的是正确的app.config设置
  • 如果我手动更改的app.config之前重新启动应用程序程序启动

有没有办法强制EF在程序启动后用正确的连接字符串重新加载/刷新?直到保存修改后的连接字符串后,我才使用上下文调用任何内容。

回答

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 
+0

感谢您的建议,我会尝试今晚稍后! – David 2014-10-07 17:27:24

0

增加一个构造函数来我的数据库对象类之后,我意识到,我没有检查刷新配置时的右侧部分。 ConfigurationManager.RefreshSection方法区分大小写,如果不匹配则不会抛出错误。

现在我可以保存配置和访问DBContext之前刷新:

appConfig.Save(ConfigurationSaveMode.Modified); 
ConfigurationManager.RefreshSection("connectionStrings"); 
相关问题