在运行时从子域设置EF ConnectionString以进行多租户设置

时间:2016-08-11 13:01:55

标签: c# entity-framework connection-string

目前,我的DbContext类有以下代码:

public ApplicationDbContext()
    : base("DefaultConnection", throwIfV1Schema: false)
{
}

public static ApplicationDbContext Create()
{
    return new ApplicationDbContext();
}

我想做的是检查子域并将其用于数据库名称,因此像http://abc.mysite.com/这样的东西会使用数据库名为abc的连接字符串。

但是如何在构造函数中操纵"DefaultConnection"的值?

2 个答案:

答案 0 :(得分:0)

DBContext将在其构造函数中使用名称或连接字符串。如果您有生成的模型,那么通常不会公开该构造函数。

您可以使用partial类来公开该构造函数:

public partial class DataEntities
{
        public DataEntities(string connectionString) : base(connectionString)
        {   
        }
}

答案 1 :(得分:0)

我以前做过。我的项目已设置为DI Castle Windsor,其中一个IWindsorInstallerDataAccessInstaller负责注册,其他类如存储库,我的数据库上下文,这里是相关代码:

container.Register(Component
               .For<MyDatabaseContext>().Forward<DbContext>()
               .ImplementedBy<MyDatabaseContext>()
               .LifestylePerWebRequest()
               .UsingFactoryMethod(context =>
               {
                 return MyDatabaseContextFactory.Create(HttpContext.Current.Request.Url);
               }));

您可以在与您的域匹配的web.config中设置多个连接字符串。

我的上下文工厂实施:

public static class MyDatabaseContextFactory
{
    public static MyDatabaseContext Create(Uri uri)
    {
        return new MyDatabaseContext(uri.GetTopDomain());
    }
}

如果您只有一个简单的项目而且甚至没有DI,您仍然可以使用工厂找出网站使用的内容并使用适当的连接字符串实例化数据库上下文。

毋庸置疑,您当前的数据库上下文构造函数不必更改。