Asp.net core 2.0 - Значение не может быть нулевым. Имя параметра: connectionString

У меня была следующая ошибка в консоли диспетчера пакетов, когда Add-Migration

Значение не может быть нулевым. Имя параметра: connectionString

Это мой запуск:

namespace MyProject
{
    public class Startup
    {
        public IConfiguration Configuration { get; set; }
        public Startup(IConfiguration config)
        {
            Configuration = config;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContextPool<AppDbContext>(options =>
                             options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddTransient<IDevRepo, DevRepo>();
            services.AddMvc();
            services.AddMemoryCache();
            services.AddSession();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseStatusCodePages();
            app.UseStaticFiles();
            app.UseMvcWithDefaultRoute();
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(Configuration["Message"]);
            });
        }
    }
}

класс программы:

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, builder) => builder.SetBasePath(context.HostingEnvironment.ContentRootPath)
                       .AddJsonFile("appsettings.json")
                       .Build())

            .UseStartup<Startup>()
            .Build();
}

appsettings.json:

{
  "Message": "Hello World",
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=NotMyFault;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Интересно, если я запустил приложение, он отобразит "Hello World", но при добавлении миграции он не сможет найти connectionString. Может ли кто-то пролить свет здесь? Спасибо.

Ответ 1

Я нашел свою собственную проблему.

У меня есть класс AppDbContextFactory, который наследует IDesignTimeDbContextFactory. Удаление этого класса устраняет эту проблему.

Ответ 2

Эта проблема возникла, когда не удалось найти строку подключения.

Вероятно, у вас есть следующие коды в классе Startup:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<BenchmarkContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("yourConnectionString name from appsettings.json")));
    }

Эти методы решают вашу проблему:

1- Вместо Configuration.GetConnectionString("yourConnectionString name from appsettings.json") просто введите строку соединения.

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<BenchmarkContext>(options =>
  options.UseSqlServer("Data Source=.;Initial Catalog=Benchmark;Persist Security Info=True;User ID=****;Password=****"));
    }

2- Если вы собираетесь использовать файл конфигурации, добавьте эти коды в класс Startup:

public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
public IConfiguration Configuration;

public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<BenchmarkContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("TestConnection")));
    }

Файл apps.txt:

{
  "ConnectionStrings": {
    "TestConnection": "Data Source=.;Initial Catalog=Benchmark;Persist Security Info=True;User ID=****;Password=****"
  }
}

После этого выполните команду "добавить-перенаправить имя" в консоли диспетчера пакетов

Ответ 3

У меня была такая же проблема, но мое решение было намного проще. Все, что я сделал, это изменить порядок appsettings.json:

{
  "Message": "Hello World",
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=NotMyFault;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

в

{
   "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=NotMyFault;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Message": "Hello World"
}

У меня есть подозрение, что в файле appsettings.json есть последовательность/порядок параметров.

Ответ 4

У меня была такая же проблема, потому что я использовал значение по умолчанию в Startup.cs. Я только что отредактировал свойство конфигурации из:

public IConfiguration Configuration { get; }

чтобы:

public IConfiguration Configuration;

и это сработало! Если кто-то скажет, почему будет оценено.

Ответ 5

Возможно, проблема связана с вашим DotNetCliToolReference из файла csproj. Если вы переносите проект из более старой версии ядра asp.net, DotNetCliToolReference не обновляется автоматически. Обновите файл yourproject.csproj для использования версии 2.0.0 CLI, как показано ниже в следующем фрагменте:

<ItemGroup>

        ...
          <DotNetCliToolReference 
               Include="Microsoft.EntityFrameworkCore.Tools.DotNet" 
               Version="2.0.0" />
</ItemGroup>

Повторите, из папки проекта, команду dotnet с ключом -v, чтобы увидеть результаты

dotnet ef database update -v

Кроме того, перепроверьте пакеты Microsoft.EntityFrameworkCore nuget для ссылки на версию 2.0.0. Удалите или обновите старые пакеты EF. Минимум:

  • Microsoft.EntityFrameworkCore.SqlServer

  • Microsoft.EntityFrameworkCore.Design

оба 2.0.0 в данный момент.

Ответ 6

У меня была похожая проблема по следующим причинам:

  • appsettings.json не был включен в проект
  • Я запускал проект по пути, который не содержал appsettings.json

Ответ 7

У меня была аналогичная проблема после попытки использовать новый созданный проект для ASP.NET Core 2.0 Web Api. Насколько я понял, причиной проблемы было то, что параметры приложения, указанные для среды разработки, не были добавлены. Я исправил его, обновив файл автозагрузки следующим образом:

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)
        .AddEnvironmentVariables();
    this.Configuration = builder.Build();
}

В моем случае класс программы выглядит следующим образом:

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

Ответ 8

Я решил свою проблему, установив правильный базовый путь. Проблема заключается в том, что миграции или что-либо еще из разных пакетов использует неправильный путь к файлу appsetting.json. Не уверен, если это официальный вопрос.

Я только что изменил мой Startup.cs следующим образом:

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, reloadOnChange: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();
    }

После этого вам просто нужно скопировать ваш appsettings.json в нужное место, если он там отсутствует.

Ответ 9

У меня была такая проблема при нагрузочном тестировании сервиса (я рекомендую его всем) и было ~ 3/1000 запросов с ошибками, поэтому я изменил

services.AddDbContextPool<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

в

string connectionString = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContextPool<AppDbContext>(options =>
options.UseSqlServer(connectionString));

Таким образом, он читает строку соединений 1 раз и не использует конфигурацию при каждом запросе. И теперь 100% запросов были успешными. Но, похоже, ошибка в .Net Core

Ответ 10

Моя проблема была, когда я пытался запустить App.dll в папке netcoreapp2.1, но правильная папка - netcoreapp2.1\publish\

Ответ 11

Это сработало для меня безупречно:

public IConfiguration Configuration;
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext.ApplicationDbContext>(options => 
            //options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            options.UseSqlServer("Server=serverAddress; Database=dbName; user=username; password=pswd"));
}

Комментируемая часть является просто ссылкой для замены.

Ответ 12

Если вы ранее переименовали строку подключения в файле appsettings и не указали ее переименование в классе DesignTimeDbContextFactory (если она есть в вашем проекте), и это проверено платформой Entity, то вы можете запустить эту проблему.

Ответ 13

Другой сценарий может быть, где вы устанавливаете конфигурацию. установить строку подключения в appsettings.jso n вместо appsettings.Development.json

Ответ 14

Если вы используете IDesignTimeDbContextFactory, вам нужно будет добавить в него конструктор по умолчанию без параметров. Попробуйте что-то вроде этого:

public DbContextFactory()
{
    IConfigurationRoot configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddEnvironmentVariables()
        .AddJsonFile("appsettings.json", false, true)
        .Build();

    _connectionString = configuration.GetConnectionString("ConnectionStringName");
}

Ответ 15

У меня была такая же проблема, и что я должен был убедиться, что имя соединения совпадает:

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddDbContext<MyContext>(options => options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));

который **** ConnectionStrings: DefaultConnection *** это было, где у меня была вся проблема. Убедитесь, что то же самое в Startup.cs и appsettings.json(appsettings.Development.json в Vs 2019)

После того, как я это исправил, все было хорошо.

Ответ 17

Для меня это было то, что у меня был appSettings.json вместо appsettings.json по какой-то причине (не совсем уверен, сделал ли VS это с недавно созданным проектом, или я переименовал его в это). Как только я сменил имя, все заработало нормально.