防止影子属性包含在查询中

时间:2018-05-01 17:04:57

标签: postgresql entity-framework-core npgsql

我尝试将PostGIS与EF Core 2.1配合使用。考虑到EF Core还不支持空间数据,我的方法是在插入行时使用触发器函数设置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提供程序)在查询中包含阴影属性?

1 个答案:

答案 0 :(得分:1)

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 Core)不处理PostGIS geometry数据类型,因为支持已经取出外部插件。这意味着目前无法以字节[]或其他任何方式读取或写入geometry

如果空间对您很重要,我建议继续使用EF Core 2.0和Npgsql 3.2.7,直到2.1.0-rc1发布,此时应该支持。