EF Migration Bundle未打包迁移:Azure DevOps部署问题排查
盯准生成Bundle的命令参数
生成bundle时必须指定EF项目和启动项目(如果EF项目不是启动项目的话),命令格式得是这样:dotnet ef migrations bundle --project ./YourEfProject/YourEfProject.csproj --startup-project ./YourWebProject/YourWebProject.csproj --configuration Release
一定要加--configuration Release,别用Debug配置生成,不然迁移可能没被正确编译进去。对齐本地和流水线的EF工具版本
本地IDE用的EF Core工具版本要和流水线里安装的完全一致,比如本地是7.0.12,流水线里就执行这个命令装同版本:dotnet tool install --global dotnet-ef --version 7.0.12
版本不匹配的话,生成的bundle根本认不出本地创建的迁移。检查迁移文件有没有被流水线打包漏掉
EF的迁移快照文件(比如YourDbContextModelSnapshot.cs)必须包含在编译输出里,去EF项目的.csproj里确认没排除这些文件:<ItemGroup> <Compile Include="Migrations\**" /> <Compile Include="YourDbContextModelSnapshot.cs" /> </ItemGroup>流水线打包EF项目时,得确保迁移文件被正确复制到输出目录,别被忽略了。
流水线里加一步迁移列表验证
生成bundle前,先执行dotnet ef migrations list --project ./YourEfProject/YourEfProject.csproj --startup-project ./YourWebProject/YourWebProject.csproj,看看输出的迁移列表里有没有AddedEmailToInvitationTable。要是没有,说明流水线环境没正确加载到迁移,得检查项目路径或者依赖配置。生产环境执行bundle的正确姿势
别直接跑bundle.exe,得指定生产库的连接字符串:bundle.exe --connection "Server=你的生产服务器;Database=你的生产库;User Id=xxx;Password=xxx;"
如果要指定特定迁移,得和dotnet ef migrations list输出的名称完全一致,大小写空格都不能错,比如迁移名是AddedEmailToInvitationTable,就执行bundle.exe --connection "xxx" --target AddedEmailToInvitationTable
内容的提问来源于stack exchange,提问作者Adrian

