EF Core為dbcontext注入了許多潛在的連接字符串

asp.net-core c# entity-framework entity-framework-core

  • 我有一個主DB數據庫上下文具有唯一的模式。
  • 我有100多個具有相同架構的數據庫,並且存在於同一台服務器上。

用戶對主數據庫進行身份驗證。在auth之後,根據用戶的不同,其餘查詢將從100多個相同架構數據庫的列表中定位特定數據庫。

在ASP .NET Core + EF Core中,如何註冊我可以為後注入指定連接字符串的工廠或上下文(基於來自auth'd用戶的提供值)?

我正在使用IDbContextFactory<MyDbContext>和其他一些選項,但我似乎無法找到在註入上下文後提供連接字符串或連接屬性的任何明確示例。

一般承認的答案

只需創建自己的工廠。

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()方法時將其Dispose()如果您的工廠註冊為transient或scoped,將在請求結束時完成)。

如果您需要訪問多個DbContext並使用tenantId (或項目中調用的任何內容)作為Dictionary<string, AppDbContext>鍵,那麼工作單元模式在這裡也會有所幫助,因此您將獲得相同的實例叫factory.Create("tenantA") 。然後添加一個SaveChanges方法,該方法將調用所有實例化的AppDbContext實例的SaveChanges



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow