Entity Framework Core:向类库自动生成数据库脚手架的问题
解决用dotnet cli添加DotNetCliToolReference的问题
针对你自动化EF Core脚手架的场景,我有两种直接的方法可以用dotnet cli给临时项目的.csproj添加DotNetCliToolReference,完全适配脚本自动化的需求:
方法1:用dotnet add package的--tool参数(推荐)
这是最简洁且官方支持的方式,dotnet cli会自动帮你在.csproj里生成正确的DotNetCliToolReference节点。以EF Core工具包为例,命令如下:
# 进入临时项目目录后执行 dotnet add package Microsoft.EntityFrameworkCore.Tools --tool
如果需要固定版本(强烈推荐,避免数据库模型生成时的版本漂移问题),可以加上--version参数:
dotnet add package Microsoft.EntityFrameworkCore.Tools --tool --version 7.0.14
执行完这个命令后,你的临时项目.csproj里会自动多出类似这样的节点:
<ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.14" /> </ItemGroup>
方法2:手动编辑.csproj文件(适合特殊场景)
如果你的dotnet cli版本不支持--tool参数(比如较旧的.NET Core 2.x版本),可以用命令行文本操作工具直接往.csproj里插入节点。
PowerShell环境:
Add-Content -Path ./TempEFScaffoldProject/TempEFScaffoldProject.csproj -Value @" <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.14" /> </ItemGroup> "@
Bash环境:
cat >> ./TempEFScaffoldProject/TempEFScaffoldProject.csproj << EOL <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.14" /> </ItemGroup> EOL
适配你的自动化脚本完整示例
结合你的需求,这里给一个完整的自动化脚本片段(以Bash为例):
# 1. 创建临时控制台项目 dotnet new console -n TempEFScaffoldProject cd TempEFScaffoldProject # 2. 添加EF工具和数据库驱动依赖 dotnet add package Microsoft.EntityFrameworkCore.Tools --tool --version 7.0.14 dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 7.0.14 # 3. 生成上下文和模型类(替换成你的数据库连接字符串) dotnet ef dbcontext scaffold "Server=YOUR_SERVER;Database=YOUR_DB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer --output-dir Models --context-dir Contexts # 4. 迁移生成的文件到共享项目(替换成你的共享项目路径) cp -r Models/* ../SharedModelProject/ cp -r Contexts/* ../SharedModelProject/ # 5. 清理临时项目 cd .. rm -rf TempEFScaffoldProject
额外注意事项
- 从.NET Core 3.0开始,官方推荐使用Local Tools替代
DotNetCliToolReference,如果你的环境是.NET 5+,也可以用dotnet tool install Microsoft.EntityFrameworkCore.Tools --local来安装本地工具,效果是一样的,只是依赖会存在.config/dotnet-tools.json里,适合临时项目的场景。 - 因为数据库工程师频繁更新模型,建议在脚本中固定所有EF相关包的版本,避免不同版本生成的模型代码不一致。
内容的提问来源于stack exchange,提问作者monty
相关产品推荐
相关产品推荐

