控制台应用程序 - 使用了命名连接字符串,但在应用程序的配置中找不到名称“DefaultConnection”

问题描述 投票:0回答:1

我遇到一个问题,在运行控制台应用程序时出现以下错误。

使用了命名连接字符串,但名称为“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;
}

我做错了什么?

c# entity-framework console-application .net-8.0
1个回答
0
投票

要解决您的问题,请删除

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));
}

当然,您可以尝试通过在容器中注册配置来“修复”控制台应用程序,但与建议的相比,它仍然不是最佳选择。

© www.soinside.com 2019 - 2024. All rights reserved.