Как применить существующие миграции для ApplicationDbContext в сборке выпуска веб-приложения ASP.NET Core с использованием SQLite

Я не могу применить существующие миграции для ApplicationDbContext в сборке выпуска моего веб-приложения ASP.NET Core с использованием базы данных SQLite. В результате мне приходится копировать файл sqlite .db из сборки Debug (которую я могу применять миграции) в сборку Release, чтобы я мог развернуть ее на своем сервере Ubuntu. Либо так, либо мне нужно вызвать app.UseDatabaseErrorPage(); в методе public void Configure() внутри Startup.cs для производственной среды, что не рекомендуется.

Чтобы воссоздать проблему, создайте веб-приложение ASP.NET Core (.NET Core) в Visual Studio с аутентификацией отдельных учетных записей пользователей. Я назвал свой проект Hevn.

Затем обновите project.json, чтобы использовать SQLite вместо SQL Server.

// Change from this
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer.Design": {
  "version": "1.0.1",
  "type": "build"
},

// to this
"Microsoft.EntityFrameworkCore.Sqlite": "1.0.1",
"Microsoft.EntityFrameworkCore.Sqlite.Design": {
  "version": "1.0.1",
  "type": "build"
},

Затем обновите Startup.cs, чтобы использовать SQLite вместо SQL Server:

// Change from this
services.AddDbContext<ApplicationDbContext>(options =>
  options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

// to this
services.AddDbContext<ApplicationDbContext>(options =>
  options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));

Затем откройте appsettings.json и измените DefaultConnection на использование базы данных SQLite. (Я назвал свой Hevn.db):

// Change DefaultConnection to use SQLite database called Hevn.db
"ConnectionStrings": {
  "DefaultConnection": "Data Source=./Hevn.db"
},

Затем откройте командную строку и примените миграции, перейдя к проекту и запустив dotnet ef database update

cd "%USERPROFILE%/Documents/Visual Studio 2015/Projects/Hevn/src/Hevn"
dotnet ef database update
dotnet run

Это создает папку bin/Debug/netcoreapp1.0, и внутри этой папки находится файл базы данных Hevn.db sqlite. Когда я просматриваю файл sqlite, я вижу, что таблицы, необходимые для аутентификации, были созданы (например, таблица AspNetUsers).

Однако я не могу сделать это для сборки выпуска. Я могу запустить dotnet build -c Release, чтобы создать выпускную версию моего приложения под bin/Release/netcoreapp1.0. Я также могу запустить dotnet run -c Release, чтобы запустить выпускную версию моего приложения. Запуск версии Release создаст файл sqlite Hevn.db под bin/Release/netcoreapp1.0, но просмотр файла sqlite показывает, что таблица не создана.

На данный момент мой единственный вариант — скопировать файл Hevn.db из сборки Debug в сборку Release.

Я также пробовал dotnet ef database update -e Production, но это все еще создает Hevn.db в сборке отладки.

Когда я запускаю свое веб-приложение ASP.NET Core в режиме отладки перед применением миграции, я получаю следующий экран при попытке зарегистрироваться или войти в систему. Я могу просто щелкнуть «Применить миграцию» или запустить dotnet ef database update, чтобы применить миграцию, а регистрация/вход работает с использованием SQLite. Можно применить миграцию в режиме отладки

Но когда я запускаю свое веб-приложение ASP.NET Core в режиме выпуска, я получаю следующий экран при попытке зарегистрироваться/войти. Я не могу применить миграции к сборке Release. Невозможно применить миграцию в режиме деблокирования

Можно ли применить миграции к сборке выпуска веб-приложения ASP.NET Core? Или мне нужно прибегнуть к копированию файла sqlite, перенесенного из базы данных, из Debug в Release?




Ответы (2)


dotnet ef database update - правильная команда. Однако по умолчанию он работает в конфигурации отладки. -e изменяет среду (т. е. влияет на такой код, как env.IsDevelopment()). Это не заставит его работать под релизом. -c до того, как база данных должна это сделать. См. https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet

Другой альтернативой является наличие разных строк подключения в зависимости от среды, а затем вы можете использовать -e для управления используемой средой.

person cellik    schedule 01.02.2017
comment
Я уже видел docs.microsoft.com/en-us/ef /core/miscellaneous/cli/dotnet и команда dotnet ef database update не имеет -c перед базой данных. Флаг -c используется в конце команды для указания контекста, но, поскольку я просто использую контекст по умолчанию, я его опускаю. Если я делаю dotnet ef database update -c Release, я получаю сообщение об ошибке No DbContext named 'Release' was found. - person kimbaudi; 02.02.2017
comment
Кроме того, я только что попробовал ваше предложение dotnet ef -c Release database update и получил ошибку Unrecognized option '-c'. Я по-прежнему склонен полагать, что нет возможности применить миграции к сборке Release для баз данных SQLite в EF Core. - person kimbaudi; 02.02.2017

эта команда создала мою базу данных sqlite в папке выпуска:

dotnet ef database update --configuration release

но тогда я использую новый msbuild .csproj, а не project.json и последний SDK. Не уверены, что это может повлиять на вас?

person Jason Kimber    schedule 02.02.2017
comment
Я попробовал dotnet ef database update --configuration release и получил ошибку Unrecognized option '--configuration'. Я использую версию dotnet 1.0.0-preview2-003131, которая по-прежнему использует project.json. Можете ли вы сказать мне, какую версию вы используете (dotnet --version)? - person kimbaudi; 02.02.2017
comment
1.0.0-превью4-004233. Это означает еще один этап обучения для вас, если вы выберете этот вариант. Я надеялся, что это исправит это для вас и в вашей версии. - person Jason Kimber; 02.02.2017
comment
возможно, это называлось как-то по-другому в предыдущей версии? это дает вам какие-то подсказки? dotnet ef database update --help - person Jason Kimber; 02.02.2017
comment
Спасибо. Я просто решил придерживаться версии 1.0.0.-preview2-1-003177, так как это последняя версия от microsoft.com/net/core. Я хорошо осведомлен о переходе MS с project.json на csproj и MSBuild. Я подожду, пока Preview 4 не станет стабильным и MS не выпустит не только инструменты CLI, но и инструменты Visual Studio и VS Code. - person kimbaudi; 02.02.2017
comment
dotnet ef database update --help не показывает вариант с именем --configuration. Возможно, это новинка для Preview 4. - person kimbaudi; 02.02.2017
comment
ах. стыд. В зависимости от вашего сценария обходной путь для вас до обновления может заключаться в использовании context.Database.Migrate(); в вашем проекте startup.cs? Это сработало для меня в сценариях project.json. - person Jason Kimber; 02.02.2017