C#在控制器中设置Entity Framework连接字符串

时间:2013-11-27 09:45:02

标签: c# entity-framework-4 repository-pattern asp.net-web-api unit-of-work

我根据这篇文章构建了我的webapi项目:A simple POC using ASP.NET Web API, Entity Framework, Autofac, Cross Domain Support

但是,我需要将连接字符串传递给DbContext,因为连接到webapi的用户可以选择要使用的其他数据库。

实现此目的的最佳方式是什么?在控制器中,有一个单独的“服务”或单独的?

2 个答案:

答案 0 :(得分:0)

一种方法是在Web配置中使用多个ConnectionStrings。然后,您可以根据传递给webapi的参数选择要使用的ConnectionString:

在您的网络配置中:

  <connectionStrings>
<add name="dataBase1" connectionString="/*db info here*/" providerName="System.Data.SqlClient" />

<add name="dataBase2" connectionString="/*db info here*/" providerName="System.Data.SqlClient" />
</connectionStrings>    

然后在你的代码中:

public someobject GetData(/*arguments*/, string dbType)
{
    var connectionString = dbType == 'dataBase1'  
    ? ConfigurationManager.ConnectionString['dataBase1'].toString() 
    : ConfigurationManager.ConnectionString['dataBase2'].toString()

    /*then pass connectionString to dbContext*/
    var dbContext = new DbContext(connectionString);
}

答案 1 :(得分:0)

我目前正在建立一个需要多个数据库的网站。这是基础(暂时)。它可能不是最好/最有效的方式,但它可以完成工作,以便我可以继续在网站上工作。

假设你有这个连接,那里的一切都是正确的,除了数据库名称可以改变。

<add name="MyDbContext" connectionString="Server=SomeConnection;Database=SomeDatabase;"providerName="System.Data.SqlClient" /> 

您可以使用此

动态创建连接字符串
public MyDbContext CreateDbContext(string databaseName)
{
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(System.Configuration.ConfigurationManager.ConnectionStrings["MyDbContext"].ConnectionString);  // Gets the default connection
    sqlBuilder.InitialCatalog = databaseName;  // Update the database name

    return new MyDbContext(sqlBuilder.ToString());
}

此外,除非您想要自动创建数据库(如果数据库不存在,可能来自不正确的数据库名称),否则您需要设置初始化程序。只需传递初始化程序null即可防止ef自动创建一个。我在MyDbContext的构造函数中设置它

public class MyDbContext : DbContext
{
    /* some other constructors */

    public MyDbContext(string nameOrConnectionString, bool createDb)
        : base(nameOrConnectionString)
    {
        if(!createdDb)
        {
            System.Data.Entity.Database.SetInitializer<MyDbContext>(null);
        }
    }
}