我可以在本地运行以下命令来使用 Entity Framework Core 迁移更新我的数据库:
dotnet ef database update 0 --project src\MyProject\MyProject.csproj --startup-project src\MyStartupProject\MyStartupProject.csproj --context MyDbContext
但是,当我尝试在 GitHub 操作中运行它时,出现错误。
行动:
name: Migrate DB
on:
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Migrate DB
shell: pwsh
run: |
dotnet tool install --global dotnet-ef
dotnet tool restore
dotnet ef database update 0 --project src\MyProject\MyProject.csproj --startup-project src\MyStartupProject\MyStartupProject.csproj --context MyDbContext
错误是:
/home/runner/work/MyProject/MyProject/src/MyProject/MyProject.csproj : 错误 MSB4057:目标“GetEFProjectMetadata”不存在于 项目。无法检索项目元数据。确保它是 SDK 风格 项目。如果您使用自定义 BaseIntermediateOutputPath 或 MSBuildProjectExtensionsPath 值,使用 --msbuildprojectextensionspath 选项。
据我所知,我没有使用自定义 BaseIntermediateOutputPath 或 MSBuildProjectExtensionsPath 值。这些项目是一个
dotnet 6
Web 项目和内置的类库 C#
。
我尝试按照类似问题中的建议添加
--msbuildprojectextensionspath
和值 obj/local
但没有效果。
您可以在程序类中迁移数据库,而不是在 github yml 文件中添加此命令:
在新程序类(ASP .NET 6)中:
using var scope = app.Services.CreateScope();
using var appContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
appContext.Database.Migrate();
经典程序课中:
var host = CreateHostBuilder(args).Build();
using var scope = host.Services.CreateScope();
var services = scope.ServiceProvider;
var context = services.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();
await host.RunAsync();
如果您的数据库不是最新的,它将迁移。
有点掌脸。事实证明,这是因为我没有首先在管道中构建项目,这意味着 git 忽略的项目不存在。我认为问题是缺少
obj
文件夹。
解决方案是使用
dotnet-ef
而不是 dotnet ef
,它会在尝试迁移之前构建项目(尽管我认为事先简单运行 dotnet build
也可能有效)。
dotnet-ef database update 0 --project src\MyProject\MyProject.csproj --startup-project src\MyStartupProject\MyStartupProject.csproj --context MyDbContext
我遇到了同样的问题,它可以在本地运行,但不能在 Azure DevOps Agent 上运行。
代理是Ubuntu,因此将路径从
\
更改为/
后,就可以正常工作了。