使用Npgsql EF Database First时无法生成Point类型属性求助
解决Npgsql+EF6 Database First不识别point类型的问题
我之前也踩过类似的坑,结合你用的版本(Npgsql 3.2.7、EntityFramework6.Npgsql 3.1.1、EF6.2),问题根源很明确:旧版本的EntityFramework6.Npgsql对PostgreSQL的point类型EDMX生成支持不完善,导致Database First时无法识别该类型,既不生成对应实体属性,还抛出Error 6005: The data type 'point' is currently not supported的错误。
下面给你两个可行的解决方案,按优先级推荐:
方案1:升级Npgsql相关包(最推荐)
旧版本的provider对PostgreSQL空间类型的支持有明显缺陷,升级到兼容EF6.2的新版本就能直接解决问题:
- 把
Npgsql升级到4.x系列(比如4.0.10,亲测和EF6.2完美兼容) - 同步升级
EntityFramework6.Npgsql到对应的4.x版本(比如4.0.10)
升级完成后,重新通过Database First生成EDMX,point类型的列会自动映射为NpgsqlTypes.NpgsqlPoint类型的实体属性,报错也会消失。
方案2:手动配置类型映射(无法升级时用)
如果项目依赖限制不能升级包,只能手动补全映射关系,步骤如下:
- 手动修改EDMX模型:
- 打开EDMX文件,在概念模型中找到对应的实体,添加一个类型为
NpgsqlTypes.NpgsqlPoint的属性(需要先确保项目引用了Npgsql程序集) - 切换到存储模型,确认对应表的point类型列存在
- 在映射层将概念模型的新属性与存储模型的point列关联起来
- 打开EDMX文件,在概念模型中找到对应的实体,添加一个类型为
- 配置App.config/Web.config:
在entityFramework节点下的Npgsql provider配置中添加类型别名,让EF识别point类型:
注意:这种手动配置的方式,后续重新生成EDMX时可能会丢失修改,需要重复操作,所以只是临时替代方案。<entityFramework> <providers> <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql"> <providerManifestToken>9.6</providerManifestToken> <!-- 替换为你的PostgreSQL版本 --> <typeAliases> <typeAlias alias="point" type="NpgsqlTypes.NpgsqlPoint, Npgsql" /> </typeAliases> </provider> </providers> </entityFramework>
不推荐的方案:拆分point类型
如果以上两种都不行,极端情况下可以把数据库中的point列拆成x和y两个数值列,让EF识别为普通数值类型,但这样会丢失PostgreSQL原生point类型的特性,不建议采用。
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

