Ответ 1
Я нашел свою собственную проблему.
У меня есть класс AppDbContextFactory, который наследует IDesignTimeDbContextFactory. Удаление этого класса устраняет эту проблему.
У меня была следующая ошибка в консоли диспетчера пакетов, когда 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. Может ли кто-то пролить свет здесь? Спасибо.
Я нашел свою собственную проблему.
У меня есть класс AppDbContextFactory, который наследует IDesignTimeDbContextFactory. Удаление этого класса устраняет эту проблему.
Эта проблема возникла, когда не удалось найти строку подключения.
Вероятно, у вас есть следующие коды в классе 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=****"
}
}
После этого выполните команду "добавить-перенаправить имя" в консоли диспетчера пакетов
У меня была такая же проблема, но мое решение было намного проще. Все, что я сделал, это изменить порядок 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 есть последовательность/порядок параметров.
У меня была такая же проблема, потому что я использовал значение по умолчанию в Startup.cs. Я только что отредактировал свойство конфигурации из:
public IConfiguration Configuration { get; }
чтобы:
public IConfiguration Configuration;
и это сработало! Если кто-то скажет, почему будет оценено.
Возможно, проблема связана с вашим 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 в данный момент.
У меня была похожая проблема по следующим причинам:
У меня была аналогичная проблема после попытки использовать новый созданный проект для 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();
}
Я решил свою проблему, установив правильный базовый путь. Проблема заключается в том, что миграции или что-либо еще из разных пакетов использует неправильный путь к файлу 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 в нужное место, если он там отсутствует.
У меня была такая проблема при нагрузочном тестировании сервиса (я рекомендую его всем) и было ~ 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
Моя проблема была, когда я пытался запустить App.dll в папке netcoreapp2.1, но правильная папка - netcoreapp2.1\publish\
Это сработало для меня безупречно:
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"));
}
Комментируемая часть является просто ссылкой для замены.
Если вы ранее переименовали строку подключения в файле appsettings и не указали ее переименование в классе DesignTimeDbContextFactory (если она есть в вашем проекте), и это проверено платформой Entity, то вы можете запустить эту проблему.
Другой сценарий может быть, где вы устанавливаете конфигурацию. установить строку подключения в appsettings.jso n вместо appsettings.Development.json
Если вы используете IDesignTimeDbContextFactory, вам нужно будет добавить в него конструктор по умолчанию без параметров. Попробуйте что-то вроде этого:
public DbContextFactory()
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json", false, true)
.Build();
_connectionString = configuration.GetConnectionString("ConnectionStringName");
}
У меня была такая же проблема, и что я должен был убедиться, что имя соединения совпадает:
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)
После того, как я это исправил, все было хорошо.
Проблема не в изменении текущего каталога. Это решает это. http://life-of-dev.sblo.jp/article/186312617.html
Для меня это было то, что у меня был appSettings.json
вместо appsettings.json
по какой-то причине (не совсем уверен, сделал ли VS это с недавно созданным проектом, или я переименовал его в это). Как только я сменил имя, все заработало нормально.