求助: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
相关产品推荐
相关产品推荐

