You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:22:15