如何设置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
相关产品推荐
相关产品推荐

