У меня была следующая ошибка в консоли диспетчера пакетов при 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. Может кто-нибудь, пожалуйста, пролить немного света здесь? Спасибо.

33
Bing Han 2 Сен 2017 в 05:46

21 ответ

Лучший ответ

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

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

2
Bing Han 10 Сен 2017 в 22:27

У меня была та же проблема, но мое решение было намного проще. Все, что я сделал, это изменил порядок 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 есть последовательность / порядок параметров.

11
Jay 5 Апр 2018 в 08:52

У меня была такая проблема при нагрузочном тестировании сервиса (я рекомендую его всем) и было ~ 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

4
Pavel Biryukov 25 Окт 2018 в 09:32

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

<ItemGroup>

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

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

dotnet ef database update -v

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

  • Microsoft.EntityFrameworkCore.SqlServer

  • Microsoft.EntityFrameworkCore.Design

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

2
Mircea Matei 8 Сен 2017 в 08:55

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

  • appsettings.json не был включен в проект
  • Я запускал проект по пути, который не содержал appsettings.json
2
bigyanshr 16 Сен 2018 в 01:50

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

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

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

1
H35am 29 Ноя 2018 в 14:50

У меня была похожая проблема, когда я указал «.UseContentRoot» в качестве текущего пути процесса.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseUrls("http://*:3001")
            .UseStartup<Startup>()
            .UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName));

Таким образом, при запуске Add-Migration путь процесса отличается от пути bin проекта, поэтому процесс не может найти файл appsettings.json. когда я удалил строку ".UseContentRoot", миграция прошла успешно

1
Eugene Shelukhin 22 Янв 2020 в 18:08

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

0
Liam Kernighan 5 Авг 2018 в 15:07

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

0
Sami-L 12 Окт 2018 в 20:43

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

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

    _connectionString = configuration.GetConnectionString("ConnectionStringName");
}
0
Tyler Findlay 6 Июн 2019 в 17:45

Я решил добавить, что это было для меня. Я следовал популярному руководству по добавлению appsettings.json и внедрению зависимостей в консольное приложение. В настройке я не осознавал, что он ссылается на текущий каталог и использует его для установки базового пути компоновщика конфигурации. Он работал нормально, когда я работал локально, но как только я попытался развернуть и выполнить запланированное задание SQL, запустил команду, он занял каталог, в котором вводилась команда, а не каталог DLL, поэтому он не нашел мою файл appsettings.json. Я просто удалил строки, связанные с получением текущего каталога и установив его в качестве базового пути, и он работает нормально. Похоже, по умолчанию это та же папка, что и DLL.

0
LeftOnTheMoon 19 Ноя 2019 в 21:48

У меня была эта проблема из-за разницы в connectionstring файла appsetting.json и параметра GetConnectionString(connectionstrings) в startup.cs. Как только я удалил лишний s в startup.cs, проблема исчезла.

0
TrampolineTales 16 Апр 2020 в 01:31

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

      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)

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

2
Carolina R 9 Июл 2019 в 04:39

У меня была похожая проблема. У меня была опечатка в appsettings.json. Изменение ConnectionsStrings на ConnectionStrings сделало это для меня!

1
carltonstith 26 Июн 2020 в 02:46

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

0
dmarlow 24 Сен 2019 в 15:11

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

public IConfiguration Configuration { get; }

Чтобы :

public IConfiguration Configuration;

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

3
Sharif Yazdian 8 Июл 2018 в 01:49

У меня была похожая проблема после попытки использовать новый созданный проект для 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();
}
1
Maxim Kornilov 8 Сен 2017 в 09:13

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

Возможно, у вас есть следующие коды в классе запуска:

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- Если вы собираетесь использовать файл конфигурации, добавьте эти коды в класс запуска:

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

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

Файл Appsetting.json:

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

После этого выполните команду «add -igration name» в консоли диспетчера пакетов.

31
Iman Bahrampour 22 Янв 2018 в 09:26

Я решил свою проблему, установив правильный базовый путь. Проблема заключается в том, что миграции или что-либо еще из разных пакетов использует неправильный путь к файлу 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 в нужное место, если он там отсутствует.

1
ADM-IT 1 Окт 2018 в 00:42

У меня была та же ошибка, и я решил ее, переместив «ConnectionStrings» в качестве первой переменной в файле appsettings.json.

2
CiaranK 21 Ноя 2019 в 00:15

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

2
aads 24 Фев 2019 в 04:55