EF Core迁移成功应用后Sqlite中Point类型列缺失问题
SQLite可视化工具不显示EF Core生成的Point列的原因
你的EF Core配置、迁移执行流程完全正常,Point列实际已经在Location表中存在,看不到是SpatiaLite扩展的存储机制和通用SQLite工具的兼容性问题导致的。
- SQLite本身没有原生空间数据类型支持,EF Core SQLite提供的NetTopologySuite空间能力,底层依赖SpatiaLite扩展实现几何类型的存储、查询。你迁移日志中执行的
AddGeometryColumn就是SpatiaLite的专用几何列注册函数,通过该方法添加的几何列有两个特殊设计:- 几何数据实际以BLOB格式存储,默认被标记为隐藏列
- 列的核心元数据(SRID值、几何类型、绑定的表字段)存储在SpatiaLite专用的
geometry_columns系统表中,不会写入SQLite原生的表结构元数据区
- 绝大多数通用SQLite可视化工具默认不会打包、加载SpatiaLite扩展,读取表结构时只会调用SQLite原生的
PRAGMA table_info(表名)接口查询列信息,自然无法识别通过SpatiaLite注册的几何列,最终表现为Point列不存在。
验证方式
可以通过两种方式确认列真实存在:
- 直接在EF Core代码中对Location实体执行增删改查操作,Point属性的读写、空间查询都能正常运行,不会出现“列不存在”的报错
- 在支持SpatiaLite的客户端(比如SpatiaLite GUI、QGIS)中打开数据库文件,执行以下SQL都能拿到正常结果:
-- 查询Location表全量数据,可以看到Point列存储的几何值 SELECT * FROM Locations; -- 查询几何列元数据,可以看到你配置的4326 SRID、point类型信息 SELECT * FROM geometry_columns WHERE f_table_name = 'Locations';
正常查看Point列的方法
如果需要在可视化工具中查看、操作Point列,任选一种方案即可:
- 换用原生集成SpatiaLite支持的SQLite客户端工具
- 给当前使用的可视化工具配置启动规则,手动加载SpatiaLite动态扩展库,重启工具后就能正常识别几何列
内容的提问来源于stack exchange,提问作者mz1378
相关产品推荐
相关产品推荐

