我无法使用SQLite数据库在我的ASP.NET Core Web应用程序的Release版本上应用ApplicationDbContext的现有迁移。因此,我必须将我的sqlite .db文件从Debug构建(我能够应用迁移)复制到Release构建,这样我就可以将它部署到我的Ubuntu服务器上。要么是这样,要么我必须在app.UseDatabaseErrorPage();
内的public void Configure()
方法中为生产环境调用Startup.cs
,这是不推荐的。
要重新创建此问题,请在Visual Studio中使用单个用户帐户身份验证创建ASP.NET Core Web应用程序(.NET Core)。我打电话给我的项目 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版本将在Hevn.db
下创建bin/Release/netcoreapp1.0
sqlite文件,但浏览sqlite文件显示没有创建表。
此时,我唯一的选择是将Hevn.db
文件从Debug复制到Release版本。
我也尝试了dotnet ef database update -e Production
,但仍然在Debug build下创建了Hevn.db
。
在应用迁移之前,我在调试模式下运行ASP.NET Core Web应用程序时,在尝试注册/登录时,会出现以下屏幕。我只需单击Apply Migrations或运行dotnet ef database update
即可使用SQLite应用迁移和注册/登录。
但是当我在发布模式下运行我的ASP.NET核心Web应用程序时,当我尝试注册/登录时,我会看到以下屏幕。我无法将迁移应用于Release版本。
是否可以在ASP.NET Core Web app的Release版本上应用迁移?或者我是否必须将数据库迁移的sqlite文件从Debug复制到Release?
答案 0 :(得分:0)
dotnet ef database update
是正确的命令。但是,默认情况下它在调试配置下运行。 -e改变环境(即影响像env.IsDevelopment()这样的代码)它不会让它在Release下运行。 -c在数据库之前应该这样做。请参阅https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet
另一种选择是根据环境使用不同的连接字符串,然后您可以使用-e来控制要使用的环境。
答案 1 :(得分:0)
此命令在release文件夹中创建了我的sqlite数据库:
dotnet ef database update --configuration release
然后我使用新的msbuild .csproj而不是project.json和最新的SDK。不确定这是否会影响你?