2012-11-29 68 views
0

一些簡單的問題:擷取EntityConnection串

所以我有這個LogInWindow對話框,我用它來收集所有的SQL登錄信息,然後構建連接字符串傳遞給ServiceManager.InitializeContext()方法,它初始化我的實體上下文與特定的提供者連接。

這一切都工作正常。但我想用App.config配置文件中定義的值初始化LogInWindow對話框。

有沒有一個首選的方法來做這個初始設置?即,我是否應該使用默認的構造函數實例化一個虛擬的EntityContext,僅僅是爲了獲取默認提供程序連接的純粹目的?有沒有「更清潔」的方式?

順便說一下,你會認爲這是一種「安全」的做法,在Form.Shown事件的處理程序中執行這種類型的Form.Close()調用嗎?我在MSDN上讀到,不建議在Form.Load事件的處理程序中調用Form.Close()

public partial class MainWindow : Form { 

    private void MainWindow_Shown(object sender, EventArgs e) { 
     using (var logInWindow = new LogInWindow()) { 
      if (logInWindow.ShowDialog(this) == DialogResult.OK) { 
       this.serviceManager.InitializeContext(logInWindow.ConnectionString); 
      } else { 
       this.Close(); 
      } 
     } 
    } 
} 


public sealed class ServiceManager : IDisposable { 

    public void InitializeContext(string connectionString) { 
     if (this.EntityContext != null) 
      throw new InvalidOperationException("EntityContext cannot be initialized multiple times."); 

     var entityConnectionString = new EntityConnectionStringBuilder(); 
     entityConnectionString.ProviderConnectionString = connectionString; 
     entityConnectionString.Provider = "System.Data.SqlClient"; 
     entityConnectionString.Metadata = "res://*/EntityModel.EntityModel.csdl|res://*/EntityModel.EntityModel.ssdl|res://*/EntityModel.EntityModel.msl"; 

     this.EntityContext = new EntityContext(entityConnectionString.ConnectionString); 
     this.EntityContext.ObjectMaterialized += EntityContext_ObjectMaterialized; 
    } 
} 

回答

1

可以使用System.Configuration類

實例訪問您的App.config的所有部分:

var connectString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 

var stringBuilder = new SqlConnectionStringBuilder(connectString); 

string UserID = stringBuilder.UserID; 
string Password = stringBuilder.Password; 
string catalog = stringBuilder.InitialCatalog; 

的App.config

<configuration> 
    <connectionStrings> 
    <add name="MyConnectionString" connectionString="metadata=res://*/........... 
    </connectionStrings> 
</configuration> 
+0

感謝。現在我很好奇,ConfigurationManager.ConnectionStrings集合返回什麼類型的連接?一個'EntityConnection'?請記住,我只對**提供程序連接字符串**部分感興趣。 – fernandoespinosa

+0

哦,我明白了,它是一個'ConnectionStringSettings' ...問題是,該類型不會將連接字符串分解爲多個部分,即初始目錄,Uset ID,密碼等等......我仍然可以使用'ConfigurationManager 「雖然有用。 – fernandoespinosa

+0

我有一個應用程序,完全按照你要綁定的方式做,我只是分割連接字符串以獲取用戶名/密碼。 有可能是一個更好的方法來做到這一點,但我發現沒有問題,我正在做這個哈克的方式:) –