C# .NET Core 2.2从数据库动态加载连接字符串

C# .NET Core 2.2从数据库动态加载连接字符串,c#,asp.net,asp.net-core,.net-core,C#,Asp.net,Asp.net Core,.net Core,是否可以从数据库加载连接字符串并在dbcontext中使用它 目前,我在数据库A中有以下一组表: 公司 使用者 一个公司可以有很多用户 公司有一个名为ConnectionString的字段 我的意图是,当属于某个公司的用户使用数据库a登录时,他们会找到属于他们公司的dbcontext,然后使用它加载数据库B、C或他们公司使用的任何数据库 我已经尝试过为这个问题寻找解决方案,但它似乎不存在。不可能吗 编辑: 这就是我在Startup.cs中加载dbContext的方式 services.AddD

是否可以从数据库加载连接字符串并在dbcontext中使用它

目前,我在数据库A中有以下一组表:

  • 公司
  • 使用者
  • 一个公司可以有很多用户

    公司有一个名为ConnectionString的字段

    我的意图是,当属于某个公司的用户使用数据库a登录时,他们会找到属于他们公司的dbcontext,然后使用它加载数据库B、C或他们公司使用的任何数据库

    我已经尝试过为这个问题寻找解决方案,但它似乎不存在。不可能吗

    编辑:

    这就是我在Startup.cs中加载dbContext的方式

     services.AddDbContext<AppDbContext>(options => options.UseSqlServer(SKCASGlobals.SK_ConnectionString));
    
    services.AddDbContext(options=>options.UseSqlServer(SKCASGlobals.SK_ConnectionString));
    
    这就是我如何从控制器中的数据库访问数据的方式:

    private readonly StarKeepDbContext dbContext;
    private readonly ILogger<ProductData> logger;
    
    public ProductData(StarKeepDbContext dbContext, ILogger<ProductData> logger)
    {
        this.dbContext = dbContext;
        this.logger = logger;
    }
    
    public string Save(ProductDetailsViewModel Input)
    {
        try
        {
            Product b = new Product
            {
                Id = Guid.NewGuid().ToString(),
                Name = Input.Name,
                BrandId = Input.Brands.BrandId,
                CategoryId = Input.Categories.CategoryId,
                Unit = Input.Unit,
                Price = Input.Price,
                CreatedOn = DateTime.Now,
                UpdatedOn = DateTime.Now
            };
            dbContext.Product.Add(b);
            dbContext.SaveChanges();
            return b.Id;
        }
        catch (Exception e)
        {
            return null;
        }
    }
    
    private只读StarKeepDbContext dbContext;
    专用只读ILogger记录器;
    公共产品数据(StarKeepDbContext dbContext,ILogger记录器)
    {
    this.dbContext=dbContext;
    this.logger=记录器;
    }
    公共字符串保存(ProductDetailsViewModel输入)
    {
    尝试
    {
    产品b=新产品
    {
    Id=Guid.NewGuid().ToString(),
    Name=Input.Name,
    BrandId=Input.Brands.BrandId,
    CategoryId=Input.Categories.CategoryId,
    单位=输入。单位,
    价格=输入。价格,
    CreatedOn=DateTime。现在,
    UpdatedOn=DateTime.Now
    };
    dbContext.Product.Add(b);
    dbContext.SaveChanges();
    返回b.Id;
    }
    捕获(例外e)
    {
    返回null;
    }
    }
    

    我不确定如何从数据库a中加载连接字符串并在此处使用它?

    不久前我遇到了这个问题。答案涉及如何在运行时连接到数据库。对我来说,我将MS Enterprise库和我的助手类rcat包装到名为C0DEC0RE的DLL存储库中

    这没有帮助,因为您使用的是.NET Core 2.2,而此解决方案是一个框架解决方案


    dbWorkshopDemo
    项目中有一些使用示例

    考虑使用向服务提供商提供访问权限的重载延迟第二个上下文的创建

    比如说

    //...
    
    services.AddDbContext<AppDbContext>(options => options.UseSqlServer(SKCASGlobals.SK_ConnectionString));
    
    services.AddDbContext<StarKeepDbContext>((serviceProvider, options) => {
        var contextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();
        var appData = serviceProvider.GetRequiredService<AppDbContext>();
    
        var userId = //...use the accessor to identify currently authenticated user
    
        //...and then extract the connection string from app data        
        var user = appData.Users.Where(u => user.SomeIdentifies == userId).FirstOrDefault();
    
        //Fail early
        if(user == null) throw new InvalidOperation("Invalid user");
    
        connectionString = user.Company.ConnectionString; //Assuming navigation property
    
        //set connection string
        options.UseSqlServer(connectionString)
    });
    
    services.AddHttpContextAccessor();
    
    //...
    
    /。。。
    services.AddDbContext(options=>options.UseSqlServer(SKCASGlobals.SK_ConnectionString));
    services.AddDbContext((serviceProvider,options)=>{
    var contextAccessor=serviceProvider.GetRequiredService();
    var appData=serviceProvider.GetRequiredService();
    var userId=/…使用访问器标识当前经过身份验证的用户
    //…然后从应用程序数据中提取连接字符串
    var user=appData.Users.Where(u=>user.SomeIdentifies==userId).FirstOrDefault();
    //早退
    如果(user==null)抛出新的InvalidOperation(“无效用户”);
    connectionString=user.Company.connectionString;//假定导航属性
    //设置连接字符串
    选项。使用SQLServer(connectionString)
    });
    AddHttpContextAccessor();
    //...
    

    通过服务提供商提取必要的信息,并用于正确配置上下文选项。

    这就是您的本意吗


    我不知道你在问什么。在数据库字段中存储连接字符串是一件非常简单的事情。对不起,我想问的是如何使用该连接字符串。存储它不是问题。使用以下方法之一,我不确定是否理解您的问题,但一旦您有了连接字符串,就可以将其传递给
    DbContext
    的构造函数,或者设置
    数据库.connection.ConnectionString
    属性。显然,您需要知道连接到定义了连接字符串的数据库所需的连接字符串?这就是我被困的地方。我还对问题进行了更多的编辑details@JianYA我认为恩科西的回答实际上更适合你们正在尝试做的事情。我也理解他的回答。但是,在我的结构中,我将访问可能位于其他服务器中的结构相同的数据库,这意味着我需要使用工作单元方法和这个连接字符串来访问每个数据库中的数据。@JianYA嗯,我很好奇您将如何为不同的用户使用这种方法,因为此时用户是未知的。您需要使用用户在第一个数据库中查找公司和连接字符串,以便知道如何连接到第二个数据库?对的还是我误解了你的意思question@Nkosi,对于单个用户,您的方法有效。但是,当我有一个具有管理员角色的用户时会发生什么?我的管理员需要对位于不同数据库中的所有P产品有一个概述,这意味着我必须收集所有连接字符串并遍历它们,同时获取数据。