Я изучил справку по обновлению до aspnetcore 2.1.0
Моя база данных SQLExpress 2016SP1
Я могу добавить миграцию, но когда я выдаю
update-database
на консоли диспетчера пакетов я получаю сообщение об ошибке
Соединение с сервером успешно установлено, но во время входа в систему произошла ошибка.
(провайдер: поставщик SSL, ошибка: 0 - цепочка сертификатов была выдана ненадежным органом.)
Строка подключения имеет вид
Server="Server=myserver;Initial Catalog=mydatabase;Trusted_Connection=True;MultipleActiveResultSets=true
The DbContext
is
public class ApiDbContext : IdentityDbContext<ApplicationUser>
{
public ApiDbContext(DbContextOptions<ApiDbContext> options)
: base(options)
{
}
}
Фабрика контекста:
public class MyContextFactory : IDesignTimeDbContextFactory<ApiDbContext>
{
public ApiDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<ApiDbContext>();
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json");
var config = builder.Build();
var connectionString = config.GetConnectionString("MyDatabase");
optionsBuilder.UseSqlServer(connectionString);
return new ApiDbContext(optionsBuilder.Options);
}
}
[Update]
Если я жестко закодирую строку подключения внутри реализации IDesignTimeDbContextFactory, то могу запуститьмиграции
public class MyContextFactory : IDesignTimeDbContextFactory<ApiDbContext>
{
public ApiDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<ApiDbContext>();
var connectionString = "Server=myserver;Initial Catalog=mydatabase;Trusted_Connection=True;MultipleActiveResultSets=true";
optionsBuilder.UseSqlServer(connectionString);
return new ApiDbContext(optionsBuilder.Options);
}
}
Жесткое кодирование строки подключения нежелательно, поэтому я хотел бы получить лучший ответ.
Мне неясно, зачем нужна реализация IDesignTimeDbContextFactory.(моя миграция завершается неудачно без нее)
Я обновил мои Startup.cs и Progam.cs, чтобы они соответствовали недавно созданной программе, где реализация не нужна.
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApiDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("MyDatabase")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApiDbContext>();
services. .AddMvc () SetCompatibilityVersion (CompatibilityVersion.Version_2_1);}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc();
}
}
[Update]
Я обновился до VS2017 версии 15.7.3.Когда я решил повторить проблему и создать первую миграцию, PM отобразил сообщение
The configuration file 'appsettings.json' was not found and is not optional
Когда я всегда отмечал эту копию файла, тогда работали и add-миграция, и update-database.