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

在.NET Core的ServiceStack.OrmLite中使用SqlGeography创建表报错

解决SqlGeography类型在CreateTableIfNotExists时的异常问题

我来帮你排查这个问题——当使用SqlGeography类型通过CreateTableIfNotExists创建表时出错,通常是因为ORM(从你的代码来看大概率是Dapper.Contrib)默认不识别这种SQL Server特定的空间类型,需要手动配置类型映射或确保依赖正确加载。下面是一步步的解决方案:

1. 确保SQL Server空间类型原生库正确加载

首先,Microsoft.SqlServer.Types包依赖原生的SQL Server空间库,需要在应用启动时手动加载,否则会出现类型初始化失败的问题。在你的应用入口(比如Program.cs或者Startup.cs)添加以下代码:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

这行代码会自动根据系统架构加载对应的x86/x64原生库,避免类型识别异常。

2. 为ORM注册SqlGeography类型映射

Dapper/Contrib默认不知道如何将SqlGeography映射到SQL Server的GEOGRAPHY列类型,需要自定义一个类型处理器并注册:

先实现类型处理器:

public class SqlGeographyTypeHandler : SqlMapper.TypeHandler<SqlGeography>
{
    public override void SetValue(IDbDataParameter parameter, SqlGeography value)
    {
        parameter.Value = value ?? DBNull.Value;
        parameter.DbType = DbType.Object;
        parameter.SqlDbType = SqlDbType.Udt;
        parameter.UdtTypeName = "GEOGRAPHY";
    }

    public override SqlGeography Parse(object value)
    {
        return value == DBNull.Value ? null : SqlGeography.Parse(value.ToString());
    }
}

然后在应用启动时注册这个处理器:

SqlMapper.AddTypeHandler(new SqlGeographyTypeHandler());

3. 在模型类上明确指定列类型

可以通过特性给模型的Location属性标注对应的数据库列类型,让ORM创建表时直接生成GEOGRAPHY类型的列:

public class Locations 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [Column("Location", TypeName = "GEOGRAPHY")]
    public SqlGeography Location { get; set; } 
}

4. 检查SQL Server版本兼容性

确认你连接的SQL Server版本是2008及以上——GEOGRAPHY类型是从SQL Server 2008开始支持的,低版本会直接报错。

如果做完这些还是有问题,建议把具体的异常信息贴出来(比如是类型转换错误还是UDT类型找不到),这样能更精准地定位问题。

内容的提问来源于stack exchange,提问作者Omid Mafakher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:09:15