我有an application written in Core 2.0, using EF Core。我使用的模式是:
我的问题是在做脚手架时(从模型创建一个视图,甚至一个与EF模型无关,或者从模型创建控制器的视图),Startup.cs / Program.cs似乎没有DI,所以没有。
由于周围没有连接字符串,脚手架时会出现故障。如果我将连接字符串添加到我的数据上下文类的无参数构造函数中,它就可以工作。在我提交代码之前我可以把它拿回来,但它看起来真的很危险。
简而言之:
使用添加db配置字符串的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.");
}
答案 0 :(得分:0)
根据我的理解,您可以尝试修改monosarsqlContext.cs下的OnConfiguring
方法,以便在处理脚手架控制器时手动检索相关设置,如下所示:
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);
}
}
}