我的项目规范是带有实体框架的 ASP.net MVC3 应用程序。
问题是客户明智的数据库将被创建。个人应用程序个人数据库对我来说工作正常。
但我想要一个应用程序,并且应该使用多个数据库。
如何达到同样的效果?
我的项目规范是带有实体框架的 ASP.net MVC3 应用程序。
问题是客户明智的数据库将被创建。个人应用程序个人数据库对我来说工作正常。
但我想要一个应用程序,并且应该使用多个数据库。
如何达到同样的效果?
您无需使用默认构造函数和 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<>
调用后面。