我根据这篇文章构建了我的webapi项目:A simple POC using ASP.NET Web API, Entity Framework, Autofac, Cross Domain Support
但是,我需要将连接字符串传递给DbContext
,因为连接到webapi的用户可以选择要使用的其他数据库。
实现此目的的最佳方式是什么?在控制器中,有一个单独的“服务”或单独的?
答案 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);
}
}
}