使用Base类将字符串传递给DbContext的构造函数不会设置值

时间:2016-05-31 05:53:39

标签: c# .net entity-framework

我已经决定是否需要对我的DbContext班级

进行更改

以前我的代码看起来像这样:

public class RPMContext : DbContext
{
    public RPMContext() : base(ConnectionString()) { }

    private static string ConnectionString(string connection)
    {
        conn = ConfigurationManager.ConnectionStrings["LH_RPMContext"].ConnectionString;
        return conn;
    }
}

在“Works”之上,但我需要能够在一个字符串中输入,我可以将静态方法 ConnectionString 设置为OTHER指定的连接字符串< / p>

因此我的新代码开始沿着不使用基础的路径

public class RPMContext : DbContext
{

    public RPMContext(string environment)
    {
        ConnectionString(environment);
    }  

    private static string ConnectionString(string connection)
    {

        string conn;

        if (connection == "LH")
        {
            conn = ConfigurationManager.ConnectionStrings["LH_RPMContext"].ConnectionString;
        }
        else 
        {
          // dev , qa  etc..
        }

        return conn;
    }


}

问题

我想这是几个我不理解的问题

  1. 我需要“设置DbContext所做的base吗?
  2. 我需要base我正在做什么吗?
  3. :this()会有什么好处吗?
  4. 以前我会使用private RPMContext db = new RPMContext();

    进行实例化

    现在RPMContext("LH")以及我希望/想要使用的任何字符串。

    显然,使用当前的代码,我正在“使用未分配的局部变量conn”

1 个答案:

答案 0 :(得分:4)

你正在给自己不必要的工作。

DbContext已经有一个构造函数,它接受完整的连接字符串或配置文件中的连接字符串的名称。

public class RPMContext : DbContext {    
    public RPMContext(string nameOrConnectionString)
        :base(nameOrConnectionString) {
    }  
}

例如,如果您的配置文件中包含以下内容

<appSettings>
    <add key="Environment" value="LH" />
</appSettings>
<connectionStrings>
    <add name="LH_RPMContext" connectionString="..." providerName="System.Data.EntityClient" />
    <add name="DEV_RPMContext" connectionString="..." providerName="System.Data.EntityClient" />
    <add name="QA_RPMContext" connectionString="..." providerName="System.Data.EntityClient" />
</connectionStrings>

您可以通过提供要使用的名称连接来创建所需的DbContext。

var db = new RPMContext("name=LH_RPMContext");
var dev_db = new RPMContext("name=DEV_RPMContext");
var qa_db = new RPMContext("name=QA_RPMContext");

或...根据你以前的一些帖子,你可以做这样的事情......

public class RPMContext : DbContext {

    public RPMContext()
        :this(string.Format("name={0}_RPMContext",ConfigurationManager.AppSettings["Environment"])){}

    public RPMContext(string nameOrConnectionString)
        :base(nameOrConnectionString) {
    }  
}