2010-03-01 78 views
1

在LinqToSql中,如果將連接字符串設置爲(無),我可以編寫一個空構造函數。在該空的構造然後我可以從web.config拉連接字符串,像這樣:如何從實體框架4.0中的web.Config動態加載連接字符串?

public CustomDataDataContext() : 
    base(ConfigurationManager.ConnectionStrings[ "DB" ].ConnectionString, mappingSource) 
{ 
    OnCreated(); 
} 

我試圖做同樣的事情,現在在實體框架4.0。這可能以某種方式嗎?我似乎無法擺脫他們生成的無參數構造函數。如果我不需要,我寧願不將上下文包裝在一個新的類中,該類將上下文連接字符串提供給上下文。

回答

3

雖然自動找到連接的無參數構造函數看起來是個不錯的主意,但它將對象上下文緊密地耦合到配置文件。

它還引入了一些「魔術」,因爲消費者沒有明確的方法來確定如何更改與無參數構造函數關聯的連接字符串(除了讀取源代碼)。

我想我的答案是,無論實體框架是否允許你這樣做,你可能不應該這樣做。使用一個工廠,而是和達到同樣的靈活性,而搭售的對象上下文來配置系統:

public interface ICustomDataContextFactory 
{ 
    CustomDataContext Create(); 
} 

public class CustomDataContextFactory : ICustomDataContextFactory 
{ 
    private readonly string _connectionStringName; 

    public CustomDataContextFactory(string connectionStringName) 
    { 
     _connectionStringName = connectionStringName; 
    } 

    public CustomDataContext Create() 
    { 
     var connectionString = ConfigurationManager.ConnectionStrings[_connectionStringName].ConnectionString; 

     return new CustomDataContext(connectionString); 
    } 
} 

這爲所有消費者創造一個無參數實例相同的機制,同時允許實現者決定如何實例被創建 - 可能需要爲特定實例使用不同的連接字符串,或者在啓動時從命令行讀取數據庫名稱。

我意識到你說你不想引入一個傳遞連接字符串的新類。我認爲這是一個來自CustomDataContext而不是工廠的類,這是一個新概念。

(這個答案只適用於生產代碼。無參數構造函數技巧在短時代碼中很有用,如概念驗證。)