我的项目规范是带有实体框架的ASP.net MVC3应用程序。
问题在于客户明智地创建了数据库。个人应用程序个人数据库对我来说很好。
但我想要一个应用程序,并且应该使用多个数据库。
如何实现同样的目标?
答案 0 :(得分:0)
不是使用默认构造函数和web.config驱动的连接字符串创建实体连接,而是需要手动构建实体连接字符串,并在构造时使用其他构造函数将其提供给它。通常有一个接受字符串,另一个接受EntityConnection
个实例。
如果唯一改变的是数据库的名称,那么你可以使用一个格式字符串 - 你可能会使用当前在web.config中的那个 - 这看起来像这样:
metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=[server];Initial Catalog=[db];User ID=[user];Password=[password]"
注意 - [server]
,[db]
,[user]
和[password]
这里是占位符。
只需将[db]
替换为{0}
。
然后 - 假设您可以从用户派生数据库名称,您可以执行以下操作:
public string BaseConnectionString {
get{
//TODO: Get base connection string - can just bake in the constant string with
//with the format placeholder. A better thing would be to add it as an
//AppSetting in web.config
}
}
//this now becomes you're primary way of getting a database connection for a user.
public MyEntities GetEntities(User user)
{
var eConnectionString = GetConnectionString(user);
return new MyEntities(eConnectionString);
}
public string GetConnectionString(User user)
{
var dbName = get_db_name_for_user(user);
return string.Format(BaseConnectionString, dbName);
}
这只是实现这一目标的一种方法。在IOC环境中,可以在简单的Resolve<>
调用后隐藏所有这些内容。