我正在创建一个多租户的asp.netmvc3web应用程序,并首先为db模型使用ef4.1代码。
对于开发,我很高兴在app_data中使用sqlserverce,对于生产,这将转移到sql server 2008。
假设我的上下文名为“mymodels”,默认情况下,代码首先在web.config中查找名为“mymodels”的连接字符串。这可以告诉您使用app_data中的文件,或者更改为在sql2008中访问数据库。到目前为止一切都很好。
但由于多租户,我希望sqlserverce文件名与租户的唯一i d匹配(因此app_data将具有“client_x.sdf”、“client_y.sdf”;sql server 2008将具有单独的数据库)。我不知道如何直接指向这些不同的数据库。
我尝试过从dbcontext继承mymodels并提供连接字符串(在web.config中使用“placeholder”conn字符串并用唯一id替换“{clientid}”),还尝试过在mymodels构造函数中设置连接字符串:
base.Database.Connection.ConnectionString = xxx;
但这似乎永远行不通。我总是得到以下错误:
发生与网络相关或特定于实例的错误
建立与SQL的连接
服务器。找不到服务器或
无法访问。验证
实例名正确,并且
服务器配置为允许远程
连接。(提供程序:命名管道
提供程序,错误:40-无法打开
连接到SQL Server)
(这表明它尚未“配置”使用sqlserverce,因此正在尝试连接到sql server。我想!)
跟踪代码database.connection.connectionString此时尚未从web.config中读取,因此我无法搜索和替换该字符串,并且可能稍后会被管道中的“占位符”conn字符串覆盖。
我想这一定很简单,我就是找不到“钩子”。有人能帮忙吗?
最佳答案
我不确定这是否是解决你问题的可能方法。
我的想法是创建一个静态的“工厂”类来实例化dbcontext类。代码如下:
public static class MyModelsFactory
{
public static MyModels CreateMyModels()
{
string connectionString = string.Empty;
// some code to retrieve your connectionString.
return new MyModels(connectionString);
}
}
在需要实例化mymodels类的任何地方,都可以调用createmymodels方法:
using (MyModels models = MyModelsFactory.CreateMyModels())
{
//your code
}
如果我需要在运行时根据某些逻辑更改连接字符串,它对我很有用。但是,我的dbcontext类是由经典ef自动生成的,而不是首先由代码生成的。