Используйте один и тот же путь к базе данных EF в EF Core 1.1 и 2.0.

Мое приложение EF Core 1.1 и ASP.NET Core 1.1 искало свою базу данных SQLite в MySolution/MyProject/bin/[Debug|Release]/netcoreapp1.1/MyDatabase.db (что, я думаю, было по умолчанию). Мои миграции создали/перенесли базу данных по этому пути, и все сработало.

Я пытаюсь перейти на netcoreapp2.0, и мои миграции все еще записываются в этот каталог. Но во время выполнения приложение ищет базу данных в MySolution/MyProject/, а не в пути к корзине. Так что конечно не получается.

Как вернуть прежнее поведение?


person grokky    schedule 30.08.2017    source источник
comment
покажи код, будет полезно   -  person tchelidze    schedule 30.08.2017
comment
@tchelidze Какой код? Я нигде не указывал путь. Так что я ожидал, что обновление до 2,0 будет вести себя так же,   -  person grokky    schedule 30.08.2017
comment
Имя MyDatabase.db не встроено в asp.net core, вы его где-то указали.   -  person tchelidze    schedule 30.08.2017
comment
@tchelidze Да, это сделано в appsettings.json, у которого есть "ConnectionStrings": { "DefaultConnection": "Filename=MyDatabase.db" }, хотя я и там ничего не менял :(   -  person grokky    schedule 30.08.2017


Ответы (2)


Это критическое изменение в EF Core 2.0 (выпуск #7588). Вы должны переместить файл базы данных в свой проект и указать Копировать в выходной каталог.

person bricelam    schedule 30.08.2017
comment
Спасибо Брайс! Что вы думаете о моем решении ниже? У меня это работает (хотя я не тестировал в продакшене), но есть ли в нем какие-то ошибки, которые делают вашу рекомендацию лучше/безопаснее? Например, безопасно ли использовать AppContext.BaseDirectory или мне следует использовать IHostingEnvironment или что-то в этом роде? - person grokky; 30.08.2017
comment
Если подумать.... Приложение ищет базу данных в каталоге приложения (расположение файла appsettings.json). Моя проблема в том, что БД уже находится в каталоге bin/output, но приложение туда не заглядывает... - person grokky; 30.08.2017

Это можно сделать так, благодаря совету @bricelam по связанной проблеме:

services.AddDbContext<MyDbContext>(
  options => {
    var builder = new SqliteConnectionStringBuilder(_configuration.GetConnectionString("DefaultConnection"));
    builder.DataSource = Path.Combine(AppContext.BaseDirectory, builder.DataSource);
    options.UseSqlite(builder.ToString());
  },
  ServiceLifetime.Scoped);

Я тестировал это в разработке, но я не уверен, работает ли это в продакшене и безопасно ли использовать AppContext.BaseDirectory (вместо IHostingEnvironment или что-то в этом роде).

person grokky    schedule 30.08.2017