我遇到一个问题,在运行控制台应用程序时出现以下错误。
使用了命名连接字符串,但名称为“DefaultConnection” 在应用程序的配置中找不到
这是我的程序.cs
static async Task Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
var sss = configuration.GetConnectionString("DefaultConnection");
Console.WriteLine(sss);
var serviceProvider = new ServiceCollection()
.AddLogging(configure => configure.AddSerilog())
.AddDbContext<MydbContext>(options => options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient)
.AddScoped<IDataService, DataService>()
.AddScoped<IMemoryCache, MemoryCache>()
.AddScoped<IStockDataImportService, StockDataImportService>()
.BuildServiceProvider();
IStockDataImportService importService = serviceProvider.GetRequiredService<IStockDataImportService>();
Console.WriteLine("Stock Data Import process started!");
await FetchFile(logger, importService, configuration);
}
现在如果我看一下 var sss。它包含正确的连接字符串,因此我知道它正在正确地从配置加载它。
但是我认为这可能与 GetRequiredService() 行有关...
无论哪种方式,我的 DataService 类都无法正确获取 dbcontext。它是StockDataImporter类中的构造函数参数
public StockDataImportService(IDataService serv)
{
_serv = serv;
}
和数据服务类
public DataService(MydbContext context, IMemoryCache memoryCache)
{
_context = context;
string? ddd = _context.Database.GetConnectionString();
_memoryCache = memoryCache;
}
我做错了什么?
要解决您的问题,请删除
OnConfiguring(DbContextOptionsBuilder optionsBuilder)
覆盖或将其更改为类似以下内容:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("name=DefaultConnection");
}
}
那么为什么它在 blazor 中可以通过 onconfigure 运行,但不能在控制台应用程序中运行?
我猜它是有效的,因为您似乎已经在 Blazor 应用程序 DI 容器中注册了
IConfiguration
。如果您查看 NamedConnectionStringResolverBase 的代码,据我所知,它是在处理连接字符串时在内部调用的,那么您将看到它将尝试解析并使用 IConfiguration
:
// HERE:
var configuration = ApplicationServiceProvider
?.GetService<IConfiguration>();
var resolved = configuration?[connectionName]
?? configuration?[DefaultSection + connectionName];
if (resolved == null)
{
throw new InvalidOperationException(
RelationalStrings.NamedConnectionStringNotFound(connectionName));
}
当然,您可以尝试通过在容器中注册配置来“修复”控制台应用程序,但与建议的相比,它仍然不是最佳选择。