使用 DI 连接字符串时的脚手架

Posted

技术标签:

【中文标题】使用 DI 连接字符串时的脚手架【英文标题】:scaffolding when using DI for connection strings 【发布时间】:2018-08-20 17:25:55 【问题描述】:

我有an application written in Core 2.0, using EF Core。我使用的模式是:

I keep my database connection string in Azure Keyvault。 我使用 program.cs 通过我的 Keyvault appid/密码读取 (.gitignore'd) json 文件,转到 Keyvault,并将我的 sql 连接字符串放入 Configuration。 DI 从那里处理一切。

我的问题是,在做脚手架时(从模型创建视图,即使是与 EF 模型没有任何关系的视图,或者从模型创建控制器),Startup.cs/Program.cs 不t 似乎运行所以没有 DI。

由于周围没有连接字符串,所以我在搭建脚手架时会失败。如果我将连接字符串添加到我的数据上下文类的无参数构造函数中,它就可以工作。我可以在提交代码之前将其取回,但这似乎真的很危险。

简而言之:

使用 DI 方法添加数据库配置字符串(而不是将它们写入您的应用程序)如何让脚手架工作?

编辑,一些代码。这通常在我的应用程序中运行,但是(我认为?)因为 DI 在脚手架期间没有运行,所以这个构造函数不会被调用。

public monosarsqlContext(IConfiguration config)

    this.m_sqlConnectioNString = config["sqlconnectionstring"];

为了让脚手架工作,我目前需要将连接字符串复制/粘贴到这个无参数构造函数中。再次,它有效,但我是一个胖手指提交远离将我的数据库连接字符串推送到公共 github 存储库。

public monosarsqlContext()


    this.m_sqlConnectioNString = 
    "Server=mycooldatabase.domain.com;Database=soradcool; 
    Persist Security Info=False;User ID=coolguy;Password=coolpassword";

    //only here for scaffolding, do not use
    throw new NotImplementedException("DBContext only used for 
    scaffolding, 
    make use of DI method.");


【问题讨论】:

【参考方案1】:

据我了解,您可以尝试修改monosarsqlContext.cs下的OnConfiguring方法,以便在处理脚手架Controller时手动检索相关设置,如下所示:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

    if (!optionsBuilder.IsConfigured)
    
        if (string.IsNullOrEmpty(m_sqlConnectioNString))
        
            var configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("azurekeyvault.json", false, true)
            .AddJsonFile("appsettings.json", false, true)
            .AddEnvironmentVariables();

            var config = configurationBuilder.Build();

            configurationBuilder.AddAzureKeyVault(
                $"https://config["azureKeyVault:vault"].vault.azure.net/",
                config["azureKeyVault:clientId"],
                config["azureKeyVault:clientSecret"]
            );

            config= configurationBuilder.Build();
            optionsBuilder.UseSqlServer(config.GetConnectionString("sqlconnectionstring"));
        
        else
        
            optionsBuilder.UseSqlServer(this.m_sqlConnectioNString);
        
    

【讨论】:

我在OnConfiguring 方法下使用来自appsettings.json 的连接字符串进行了测试。对于 AddAzureKeyVault 部分,您需要检查是否可以通过config["sqlconnectionstring"]config.GetConnectionString("sqlconnectionstring") 读取。

以上是关于使用 DI 连接字符串时的脚手架的主要内容,如果未能解决你的问题,请参考以下文章

使用 Multisubnetfailover=True 时的连接超时

使用 Database.Create 的对象名称“dbo.__MigrationHistory”无效;传入连接字符串时的EF6.02

从映射连接字符串时的性能

连接相邻字符串文字时的 Python 运算符优先级

jquery选择器中的字符串连接

Python连接MySQL数据库执行sql语句时的参数问题