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

本文关键字:设置 EF ConnectionString 运行时 | 更新日期: 2023-09-27 18:01:51

目前,我的DbContext类有这样的代码:

public ApplicationDbContext()
    : base("DefaultConnection", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
    return new ApplicationDbContext();
}

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

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

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

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

可以使用分部类来公开构造函数:

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

我以前就这样做过。我的项目是用Castle WindsorDI设置的,我的IWindsorInstaller s之一是DataAccessInstaller负责注册,在其他类中,如存储库,我的数据库上下文,以下是相关代码:

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

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

我的上下文工厂实现:

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

如果你只有一个简单的项目,甚至没有DI,你仍然可以使用一个工厂来发现网站使用什么,并使用适当的连接字符串实例化一个数据库上下文。

不用说,您当前的数据库上下文构造函数不必更改。