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

如何设置SkipGeographyChecks为true?多多边形保存遇SQL Server异常

解决SQL Server地理多边形保存时的方向校验问题

首先,这个异常是因为SQL Server的geography类型要求多边形的外环必须是逆时针方向,而你的部分多边形不符合这个规则。要设置SkipGeographyChecks跳过这个校验,有两种常见的实现方式:

方法一:全局配置(针对整个DbContext)

在你的DbContext的OnConfiguring方法中,配置SQL Server的地理选项时启用跳过校验:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer(
        "你的数据库连接字符串",
        sqlOptions => sqlOptions
            .UseGeography() // 启用地理类型支持
            .SkipGeographyChecks()); // 跳过地理校验
}

方法二:针对单个实体属性配置

如果只想给特定实体的地理属性跳过校验,可以在OnModelCreating里用Fluent API配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<你的实体类名称>()
        .Property(e => e.Polygons) // 对应你代码里的Polygons属性
        .HasColumnType("geography")
        .SkipGeographyChecks(); // 给这个属性单独跳过校验
}

额外建议:修正多边形方向(更规范的做法)

虽然跳过校验能快速解决问题,但可能会影响后续地理相关的查询计算(比如空间交集、面积计算等)。更推荐的方式是主动修正多边形的方向,利用NetTopologySuite的内置方法:

var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326); 
var polyList = new List<Polygon>();

// 第一个多边形
var poly1 = new Polygon(new LinearRing(new Coordinate[] { 
    new Coordinate(19.2385498607974, -51.50390625,0), 
    new Coordinate(24.1367281697474, -37.6171875,0), 
    new Coordinate(13.8487471475372, -18.10546875,0), 
    new Coordinate(19.2385498607974, -51.50390625,0), 
}));
// 检查并修正方向
if (!poly1.ExteriorRing.IsCounterClockwise())
{
    poly1.Reverse();
}
polyList.Add(poly1);

// 第二个多边形
var poly2 = new Polygon(new LinearRing(new Coordinate[] { 
    new Coordinate(-10.0445849842118, -53.0859375,0), 
    new Coordinate(4.13824308398371, -58.7109375,0), 
    new Coordinate(2.20770545570541, -68.73046875,0), 
    new Coordinate(-8.83079518432893, -79.1015625,0), 
    new Coordinate(-17.3820949478775, -81.2109375,0), 
    new Coordinate(-21.0332372344673, -51.328125,0), 
    new Coordinate(-10.0445849842118, -53.0859375,0), 
}));
if (!poly2.ExteriorRing.IsCounterClockwise())
{
    poly2.Reverse();
}
polyList.Add(poly2);

var currentLocation = geometryFactory.CreateMultiPolygon(polyList.ToArray()) as MultiPolygon; 
dbset.Polygons = currentLocation; 
_context.Add(dbset); 
await _context.SaveChangesAsync();

这样既符合SQL Server的地理类型规范,又能避免后续潜在的空间查询问题。

内容的提问来源于stack exchange,提问作者Pabodha Wimalasuriya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:17:16