EF Core为dbcontext注入了许多潜在的连接字符串

时间:2017-05-26 16:28:46

标签: c# entity-framework asp.net-core entity-framework-core

  • 我有一个主数据库上下文,它具有唯一的架构。
  • 我有100多个具有相同架构且存在于同一服务器上的数据库。

用户针对主数据库进行身份验证。在auth之后,根据用户的不同,其余查询将从100多个相同架构数据库的列表中定位特定数据库。

在ASP .NET Core + EF Core中,如何注册我可以为后注入指定连接字符串的工厂或上下文(基于来自auth&d; dd用户提供的值)?

我正在使用IDbContextFactory<MyDbContext>和其他一些选项,但我似乎无法找到在注入上下文后提供连接字符串或连接属性的任何明确示例。< / p>

1 个答案:

答案 0 :(得分:2)

只需创建自己的工厂。

public interface ITentantDbContextFactory<T>
{
    T Create(string tenantId);
}

public class AppTenantDbContextFactory : ITenantDbContextFactory<AppDbContext>
{
    public AppDbContext Create(string tenantId) 
    {
        // do some validations on tenantId to prevent users from 
        // injecting arbitrary strings into the connection string 
        var builder = new DbContextOptionsBuilder<AppDbContext>();

        // you can also load it from an injected option class
        builder.UseSqlServer($"Server=MYSERVERHERE;Database={tenantId};Trusted_Connection=True;");

        return new AppDbContext(builder.Options);
    }
}

然后将工厂注入您需要的地方。缺点是您必须管理DbContext的实时时间并进行处理。

您还可以在工厂中实现IDisposable接口并保留参考列表并在调用Dispose()方法时将其处理掉(如果您的工厂是工厂,则会在请求结束时执行此操作注册为瞬态或范围。

此外,如果您需要访问多个DbContext并使用tenantId(或项目中调用的任何内容)作为Dictionary<string, AppDbContext>中的键,那么工作单元模式也会非常有用,所以你调用factory.Create("tenantA")时会得到相同的实例。然后添加SaveChanges方法,该方法将调用所有实例化SaveChanges实例的AppDbContext