【问题标题】:How to apply existing migrations for ApplicationDbContext in Release build of ASP.NET Core web application using SQLite如何在使用 SQLite 的 ASP.NET Core Web 应用程序的发布版本中为 ApplicationDbContext 应用现有迁移
【发布时间】:2017-06-18 02:00:39
【问题描述】:

我无法在使用 SQLite 数据库的 ASP.NET Core Web 应用程序的发布版本上应用 ApplicationDbContext 的现有迁移。结果,我必须将我的 sqlite .db 文件从 Debug 构建(我能够应用迁移)复制到 Release 构建,以便我可以将它部署在我的 Ubuntu 服务器上。要么这样,要么我必须在 Startup.cs 内的 public void Configure() 方法中调用 app.UseDatabaseErrorPage(); 用于生产环境,不建议这样做。

要重现此问题,请在 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 Releasebin/Release/netcoreapp1.0 下构建我的应用程序的发布版本。我还可以运行 dotnet run -c Release 来运行我的应用程序的发布版本。运行Release版本会在bin/Release/netcoreapp1.0下创建Hevn.db sqlite文件,但是浏览sqlite文件显示没有创建表。

此时,我唯一的选择是将 Hevn.db 文件从 Debug 复制到 Release 构建中。

我也尝试了dotnet ef database update -e Production,但这仍然会在调试构建下创建Hevn.db

当我在应用迁移之前在调试模式下运行我的 ASP.NET Core Web 应用程序时,我在尝试注册/登录时收到以下屏幕。我只需单击 Apply Migrations 或运行 dotnet ef database update 即可使用 SQLite 应用迁移和注册/登录工作。

但是当我在发布模式下运行我的 ASP.NET Core Web 应用程序时,当我尝试注册/登录时会出现以下屏幕。我无法将迁移应用到发布版本。

是否可以在 ASP.NET Core Web 应用的发布版本上应用迁移?还是我必须求助于将数据库迁移的 sqlite 文件从 Debug 复制到 Release?

【问题讨论】:

    标签: sqlite asp.net-core entity-framework-core entity-framework-migrations dotnet-cli


    【解决方案1】:

    此命令在发布文件夹中创建了我的 sqlite 数据库:

    dotnet ef database update --configuration release
    

    但是我使用的是新的 msbuild .csproj 而不是 project.json 和最新的 SDK。不确定这是否会影响到您?

    【讨论】:

    • 我试过dotnet ef database update --configuration release 并收到错误Unrecognized option '--configuration'。我正在使用 dotnet 版本 1.0.0-preview2-003131,它仍然使用 project.json。你能告诉我你正在运行什么版本(dotnet --version)吗?
    • 1.0.0-preview4-004233。如果您选择该选项,这确实意味着您将进入另一个学习阶段。我希望它也能在你的版本中为你解决这个问题。
    • 它在以前的版本中可能被称为不同的东西吗?这会给你任何线索吗? dotnet ef database update --help
    • 谢谢。我只是决定坚持使用 1.0.0.-preview2-1-003177,因为这是来自 microsoft.com/net/core 的最新版本。我很清楚 MS 从 project.json 转移到 csproj 和 MSBuild。我会等到 Preview 4 稳定后,MS 不仅会发布 CLI 工具,还会发布 Visual Studio 和 VS Code 工具。
    • dotnet ef database update --help 没有显示名为 --configuration 的选项。也许它是 Preview 4 版本的新功能。
    【解决方案2】:

    dotnet ef database update 是正确的命令。但是默认情况下它在调试配置下运行。 -e 更改环境(即影响 env.IsDevelopment() 之类的代码)它不会使其在 Release 下运行。 -c before database 应该这样做。请看https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet

    另一种选择是根据环境使用不同的连接字符串,然后您可以使用 -e 来控制要使用的环境。

    【讨论】:

    • 我已经看到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.
    • 另外,我刚刚尝试了您的建议dotnet ef -c Release database update 并收到错误Unrecognized option '-c'。我仍然倾向于相信没有办法将迁移应用到 EF Core 中 SQLite dbs 的 Release 版本。
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2010-09-08
    • 2020-12-24
    相关资源
    最近更新 更多