我试图在EFCore2.1中使用PostGIS。考虑到EF还不支持空间数据,我的方法是在插入行时有一个由触发器函数设置的geometry
列,我将在查询中使用该列并使用FromSql
子句--这样我的实体中就根本不存在属性。
我已经将该列声明为一个影子属性,如:modelBuilder.Entity<MyEntity>().Property<byte[]>("LocationBlob").HasColumnType("geometry");
,并在迁移过程中正确地创建了它。我的问题是,每次查询此表时,生成的SQL SELECT
的此列都会导致错误The field 'LocationBlob' has type 'public.geometry', which is currently unknown to Npgsql.
。
实际上,我不需要检索这个属性,那么是否有一种方法可以防止EF (或Postgres提供程序)在查询中包含影子属性?
发布于 2018-05-01 21:30:57
EF Core 2.1 (目前仍在预览中)将完全支持空间数据--目前缺乏支持的情况是非常短暂的,因此没有必要设置任何特殊的技巧。
事实上,改善空间支持将是改进的主要领域之一。预-2.1空间支持(通过内置类型(如PostgisPoint) )将通过插件返回,但除此之外,PostGIS类型还将通过NetTopologySuite .NET空间库提供支持,甚至支持将主要空间操作转换为SQL。因此,调用NetTopologySuite的x.Covers(y)
的LINQ查询将被转换为PostGIS ST_Covers(x, y)
。
关于您的具体解决方法(同样不应该这样做),当前的问题是,Npgsql的ADO.NET层(而不是EF )没有处理PostGIS geometry
数据类型,因为已经对外部插件提供了支持。这意味着目前没有任何方法可以读取或写入geometry
,如byte[]或其他任何东西。
如果空间对您很重要,我建议继续使用EFCore2.0和Npgsql 3.2.7,直到2.1.0-rc1发布,此时应该有支持。
https://stackoverflow.com/questions/50120682
复制相似问题