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

Preventing a shadow property to be included in queries

我正在尝试将 PostGIS 与 EF Core 2.1 结合使用。考虑到 EF Core 还不支持空间数据,我的方法是在插入行时有一个由触发器函数设置的 geometry 列,我会在我的查询中使用该列 FromSql 子句 - 因此 属性 根本不存在于我的实体中。

我已将该列声明为影子 属性,如下所示:modelBuilder.Entity<MyEntity>().Property<byte[]>("LocationBlob").HasColumnType("geometry"); 并且它是在迁移过程中正确创建的。我的问题是每次查询这个table,生成SQLSELECTs这个列,导致错误The field 'LocationBlob' has type 'public.geometry', which is currently unknown to Npgsql.

我实际上不需要检索此 属性,那么有没有办法阻止 EF(或 Postgres 提供程序)在查询中包含影子属性?

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,作为 byte[] 或任何其他内容。

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