Строка подключения NULL

#c# #asp.net-core #.net-core #argumentnullexception

#c# #asp.net-core #.net-ядро #исключение argumentnullexception

Вопрос:

Я получаю эту ошибку:

При обработке запроса произошло необработанное исключение. Исключение ArgumentNullException: значение не может быть нулевым. Имя параметра: строка подключения

Мой DbContext :

 public class ApplicationDBContext : DbContext
{
    public ApplicationDBContext(DbContextOptions<ApplicationDBContext> options) : base(options)
    {
    }

    public DbSet<AcumuladoStock> AcumuladoStockDB { get; set; }
    public DbSet<CabeceraPedidoCliente> CabeceraPedidoClienteDB { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        IConfigurationRoot config = builder.Build();

        optionsBuilder.UseSqlServer(config.GetConnectionString("DefaultConnection"));
    }
}

public class AcumuladoStock
{
        [Key]
        public int CodigoEmpresa { get; set; }

        public string Ejercicio { get; set; }
        public string CodigoArticulo { get; set; }
        public string Periodo { get; set; }
        public string Partida { get; set; }
        public string UnidadSaldo { get; set; }
}
  

Мой запуск:

 public void ConfigureServices(IServiceCollection services)
{
    // services.AddTransient<GetAcumuladoController>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddDbContext<ApplicationDBContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
    );
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
       .SetBasePath(env.ContentRootPath)
       .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseMvc();
}
  

Appsettings.json :

 { 
  "ConnectionString": { 
    "DefaultConnection": "Server=XXXXX; Database=XXX; User Id=xx; Password=XXXXX; Pooling=true;" 
  }, 
  "Logging": { 
    "LogLevel": { 
      "Default": "Warning" 
    } 
  }, 
  "AllowedHosts": "*" 
} 
  

Комментарии:

1. Итак, у вас есть DefaultConnection ключ-значение в вашем appsettings.json ?

Ответ №1:

ConfigureServices вызывается перед Configure в Startup . Похоже, вы создаете свою конфигурацию после того, как уже пытались получить к ней доступ.

Переместите код сборки, который будет вызван ранее в потоке

 private IConfiguration Configuration;

public Startup(IHostingEnvironment env) {
    var builder = new ConfigurationBuilder()
       .SetBasePath(env.ContentRootPath)
       .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    Configuration = builder.Build(); //<--
}

public void ConfigureServices(IServiceCollection services) {

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddDbContext<ApplicationDBContext>(options => 
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
    );
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {

    if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
    } else {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseMvc();
}
  

Вы должны удалить OnConfiguring переопределение из DbContext, поскольку у него нет настроенного базового пути, поэтому, скорее всего, это приводит к тому, что файл настроек не найден.