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

求助:ASP.NET Core 2中Dapper读取SQL Server Geometry字段报错

解决ASP.NET Core 2中读取SQL Server Geometry列时的UDT不支持错误

看起来你的问题核心在于自定义NuGet包的API项目无法处理Geometry类型,而直接CRUD项目可以正常运行——这说明代码逻辑本身没问题,问题大概率出在依赖传递、平台配置或者NuGet包的打包细节上。下面是针对性的排查和解决步骤:

1. 核对依赖项的一致性

直接CRUD项目能正常读取Geometry列,说明它已经包含了处理SQL Server UDT(用户定义类型,Geometry属于此类)的必要依赖。你需要:

  • 打开直接CRUD项目的NuGet包管理器,找到和SQL Server空间数据相关的包,比如:
    • Microsoft.SqlServer.Types(针对传统ADO.NET的UDT处理)
    • Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite(针对EF Core 2.x的空间数据支持)
    • NetTopologySuite.SqlServer(辅助空间数据映射)
  • 确保API项目和自定义NuGet包都引用了相同版本的这些包。如果自定义NuGet包没有把这些依赖标记为“可传递”,API项目需要手动安装这些包。

2. 检查NuGet包的打包配置

如果自定义NuGet包是你自己开发的,要确保它正确传递了空间数据相关的依赖:

  • 如果你用SDK风格项目打包,打开项目文件(.csproj),检查相关PackageReference的PrivateAssets属性,不要设置为all——否则依赖不会被传递到API项目中。示例:
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite" Version="2.2.6">
      <PrivateAssets>none</PrivateAssets> <!-- 确保依赖可传递 -->
    </PackageReference>
    
  • 如果用.nuspec文件打包,要在<dependencies>节点中明确添加这些依赖项,让NuGet自动安装到API项目。

3. 统一平台目标并加载原生库

Microsoft.SqlServer.Types依赖原生的平台特定库(x86/x64),如果API项目的平台目标和直接CRUD项目不一致,会导致加载失败:

  • 右键API项目 → 属性 → 生成 → 平台目标,设置为和直接CRUD项目相同的选项(比如x64),避免使用Any CPU。
  • 在API项目的启动代码中(比如Startup.cs的ConfigureServices方法开头),添加加载原生库的代码:
    using Microsoft.SqlServer.Types;
    
    public void ConfigureServices(IServiceCollection services)
    {
        // 加载SQL Server Types的原生库,必须在DbContext初始化前调用
        SqlServerTypes.Utilities.LoadNativeAssemblies(AppContext.BaseDirectory);
        
        // 后续的DbContext配置等代码...
    }
    

4. 确认DbContext的空间数据配置

在自定义NuGet包的DbContext中,确保已经正确配置了Geometry列的映射:

  • 如果使用EF Core 2.x,在配置DbContext时启用NetTopologySuite支持:
    services.AddDbContext<YourDbContext>(options =>
        options.UseSqlServer(
            connectionString,
            sqlOptions => sqlOptions.UseNetTopologySuite() // 启用空间数据支持
        ));
    
  • 在OnModelCreating方法中,明确指定Geometry列的类型:
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<YourEntity>()
            .Property(e => e.MyLocation)
            .HasColumnType("geometry"); // 匹配SQL Server中的列类型
    }
    

5. 排查NuGet包的目标框架兼容性

确保自定义NuGet包的目标框架和API项目一致(都是.NET Core 2.x)。如果你的NuGet包是针对.NET Framework编译的,可能会出现兼容性问题——这种情况下需要重新编译NuGet包,目标框架设置为netcoreapp2.x。

按以上步骤逐一排查,应该能解决“Type Udt is not supported on this platform”的错误。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:46:02