簡體   English   中英

如何在Entity Framework 4.0中從web.Config動態加載連接字符串?

[英]How to dynamically load connection string from web.Config in Entity Framework 4.0?

在LinqToSql中,如果將Connection字符串設置為(None),則可以編寫一個空的構造函數。 在那個空的構造函數中,我可以像這樣從web.Config中提取連接字符串:

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

我現在嘗試在Entity Framework 4.0中執行相同的操作。 這有可能嗎? 我似乎無法擺脫他們生成的無參數構造函數。 我寧願不要將上下文包裝在一個新的類中,如果不需要的話,該類會將上下文的連接字符串提供給上下文。

雖然自動找到連接的無參數構造函數似乎是一個好主意,但它卻將對象上下文緊密耦合到配置文件。

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

我想我的答案是,無論Entity Framework是否允許您執行此操作,您都可能不應該這樣做。 使用工廠代替,並在不將對象上下文綁定到配置系統的情況下實現相同的靈活性:

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派生的類,而不是工廠,這是一個新概念。

(此答案僅確實適用於生產代碼。無參數構造函數的技巧在概念驗證之類的臨時代碼中很有用。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM