ASP.NET Core 8 Web API从ClickHouse脚手架生成实体遇DesignTimeProviderServices错误
解决ASP.NET Core 8中ClickHouse EF Core脚手架生成实体的错误
问题场景
在ASP.NET Core 8 Web API项目中尝试从ClickHouse数据库生成实体,已安装的NuGet包配置如下:
<ItemGroup> <PackageReference Include="ClickHouse.Client" Version="7.7.3" /> <PackageReference Include="EFCore.ClickHouse" Version="8.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.8" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.8"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.8"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> </ItemGroup>
执行EF Core脚手架命令:
dotnet ef dbcontext scaffold "Host=127.0.0.1;Port=8123;User=default;Password=;Database=db2;Compress=True;CheckCompressedHash=False;SocketTimeout=60000000;Compressor=lz4" EFCore.ClickHouse -o Models -c MyDbContext
触发错误提示:
Unable to find expected assembly attribute [DesignTimeProviderServices] in provider assembly 'EFCore.ClickHouse'. This attribute is required to identify the class which acts as the design-time service provider factory for the provider.
已确认连接字符串可正常访问ClickHouse数据库。
解决方法
1. 统一EF Core与EFCore.ClickHouse版本
EFCore.ClickHouse 8.0.0与EF Core 8.0.8存在版本适配问题,需将EF Core相关包降级至8.0.0,保持版本一致:
修改项目文件中的NuGet包配置:
<ItemGroup> <PackageReference Include="ClickHouse.Client" Version="7.7.3" /> <PackageReference Include="EFCore.ClickHouse" Version="8.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0"> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <PrivateAssets>all</PrivateAssets> </PackageReference> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> </ItemGroup>
执行dotnet restore命令恢复包,之后重新运行脚手架命令。
2. 手动实现设计时DbContext工厂
若版本调整后问题仍存在,可手动创建设计时服务工厂类,绕过自动检测逻辑:
在项目中添加如下类:
using Microsoft.EntityFrameworkCore.Design; using Microsoft.EntityFrameworkCore; using EFCore.ClickHouse.Infrastructure; public class ClickHouseDesignTimeFactory : IDesignTimeDbContextFactory<MyDbContext> { public MyDbContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>(); optionsBuilder.UseClickHouse("Host=127.0.0.1;Port=8123;User=default;Password=;Database=db2;Compress=True;CheckCompressedHash=False;SocketTimeout=60000000;Compressor=lz4"); return new MyDbContext(optionsBuilder.Options); } }
确保MyDbContext类名称与脚手架命令中的-c MyDbContext参数一致,之后重新执行脚手架命令。
3. 备选方案:使用ClickHouse.Client手动生成实体
如果EFCore.ClickHouse的脚手架功能持续异常,可直接使用ClickHouse.Client查询表结构,手动或通过T4模板生成实体类:
- 编写代码连接ClickHouse,查询
system.tables和system.columns获取表与字段信息 - 根据查询结果编写实体类,或借助T4模板实现自动化生成
内容的提问来源于stack exchange,提问作者navnforfun
相关产品推荐
相关产品推荐

