C# 现在,当从windows任务调度器运行.net核心控制台应用程序时,可以读取appsettings.json文件中的连接字符串

C# 现在,当从windows任务调度器运行.net核心控制台应用程序时,可以读取appsettings.json文件中的连接字符串,c#,.net-core,C#,.net Core,我有一个.net核心控制台应用程序,它正在从appsettings.json文件读取连接字符串。当我从VisualStudio运行应用程序时,它工作正常。但是当我从任务调度器运行这个控制台应用程序时,它无法从appsettings.json文件中读取连接字符串 异常: 异常:System.ArgumentNullException:值不能为null。 参数名称:连接字符串位于 Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(字符串值,

我有一个.net核心控制台应用程序,它正在从appsettings.json文件读取连接字符串。当我从VisualStudio运行应用程序时,它工作正常。但是当我从任务调度器运行这个控制台应用程序时,它无法从appsettings.json文件中读取连接字符串

异常

异常:System.ArgumentNullException:值不能为null。 参数名称:连接字符串位于 Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(字符串值, 字符串参数(名称)位于 Microsoft.EntityFrameworkCore.SqlServerDbContextOptionsExtensions.UseSqlServer(DbContextOptionsBuilder 选项生成器,字符串连接字符串,操作
1
SQLServerOptions(操作)位于
GetValueFromDBCore.TestContext.OnConfigurang(DbContextOptionsBuilder
选项生成器)中
P:\Users\vivek.nuna\Redis\GetValueFromDBCore\GetValueFromDBCore\GetValueFromDBCoreContext.cs:line
25分
Microsoft.EntityFrameworkCore.DbContext.get\u InternalServiceProvider()
在Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()中
在Microsoft.EntityFrameworkCore.DbContext.get_Model()中
Microsoft.EntityFrameworkCore.Internal.InternalDbSet
1.get\u EntityType() 在 Microsoft.EntityFrameworkCore.Internal.InternalDbSet
1.get_EntityQueryable()
在
Microsoft.EntityFrameworkCore.Internal.InternalDbSet
1.System.Linq.IQueryable.get\u Provider() 在 Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSqlRaw[TEntity](DbSet`1) 源、字符串sql、对象[]参数)位于 中的GetValueFromDBCore.Program.SetFreshDataInCache() P:\Users\vivek.nuna\Redis\GetValueFromDBCore\GetValueFromDBCore\Program.cs:line 中的GetValueFromDBCore.Program.Main(字符串[]args)处的30 P:\Users\vivek.nuna\Redis\GetValueFromDBCore\GetValueFromDBCore\Program.cs:line 十八

DBCOnext类:

class TestContext: DbContext
    {
        public DbSet<EmployeeEntity> EmployeeEntity { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {

            var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

            IConfigurationRoot configuration = builder.Build();


            optionsBuilder.UseSqlServer(configuration.GetConnectionString("db_core_ef_first"));
        }
    }
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="StackExchange.Redis" Version="2.0.601" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>
类TestContext:DbContext
{
公共DbSet EmployeeEntity{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
var builder=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,可选:true,reloadOnChange:true);
IConfigurationRoot配置=builder.Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString(“db_core_ef_first”);
}
}
CS项目文件:

class TestContext: DbContext
    {
        public DbSet<EmployeeEntity> EmployeeEntity { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {

            var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

            IConfigurationRoot configuration = builder.Build();


            optionsBuilder.UseSqlServer(configuration.GetConnectionString("db_core_ef_first"));
        }
    }
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="StackExchange.Redis" Version="2.0.601" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

Exe
netcoreapp2.1
总是

注意我发布了控制台应用程序exe,并为任务计划程序提供了exe路径。

我能够解决这个问题,我在code
中使用了
目录.GetCurrentDirectory()
.SetBasePath(Directory.GetCurrentDirectory())
所以当我从VS运行时,它工作正常。我用
Assembly.GetEntryAssembly().Location替换了它,现在它工作正常

参考: