在实体框架中使用 Postgis 的几何类型

Noo*_*ntu 3 c# asp.net geometry entity-framework postgis

我一直在尝试使用 ASP.NET Core 构建我的第一个 API 项目。

一切都很顺利,除了一件事。每当我尝试添加一个新的脚手架控制器时(当然是在添加我的模型之后),我会收到以下错误:

属性“Favor.Coordinates”属于“Geometry”类型,当前数据库提供程序不支持该属性。使用“[NotMapped]”特性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”更改属性 CLR 类型或忽略该属性。

这是不言自明的;我有一个Geometry类型(来自 Postgis)的模型类,这似乎导致了实体框架的问题。

我做了什么?

  • 我已经创建了我的数据库并添加了 Postgis 扩展以便能够使用几何数据类型
  • 我已经添加了Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite包以支持Geometry我的项目,如以下教程中所述:https : //docs.microsoft.com/en-us/ef/core/modeling/spatial
  • 我已经添加了所有必需的 Npgsql 扩展以将 PostgreSQL 与 ASP.NET 一起使用,并从数据库生成所有模型类

值得一提的是NetTopologySuite,正如教程中提到的,我还在生成模型之前添加了该包。然而,每当我尝试使用实体框架添加脚手架 API 控制器时,我都会收到上述错误,尽管 NTS 确实支持 Geometry.

为了进一步参考,这里Favor是错误提到的类:

using System;
using System.Collections.Generic;
using NetTopologySuite.Geometries;

namespace FavorAPI.Models
{
    public partial class Favor
    {
        public Favor()
        {
            Payment = new HashSet<Payment>();
            Request = new HashSet<Request>();
        }

        public int Idfavor { get; set; }
        public string Description { get; set; }
        public string Title { get; set; }
        public DateTime? Creationtime { get; set; }
        public DateTime? Happeningtime { get; set; }
        public double? Price { get; set; }
        public short? Estimatedtime { get; set; }
        public short? Maxpeople { get; set; }
        public short? Currentpeople { get; set; }
        public Geometry Coordinates { get; set; } //<-- Problematic!
        public int? Idstatus { get; set; }
        public int? Idposter { get; set; }
        public int? Idcategory { get; set; }

        public virtual Category IdcategoryNavigation { get; set; }
        public virtual Individual IdposterNavigation { get; set; }
        public virtual Favorstatus IdstatusNavigation { get; set; }
        public virtual ICollection<Payment> Payment { get; set; }
        public virtual ICollection<Request> Request { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还添加x => x.UseNetTopologySuite()到我的数据库上下文中。有谁知道我可能做错了什么?我总是可以添加[NotMapped]错误提到的属性,但我确实希望映射此属性。

提前致谢!

编辑:手动创建控制器(而不是通过脚手架)工作并且不会引发任何错误,但如果我尝试访问任何控制器端点的路由,最终会出现相同的错误消息。

Noo*_*ntu 5

解决了。事实证明,我不应该只包含x => x.UseNetTopologySuite()在 DB Context 文件中,还要包含在 Startup.cs 中。呸!

services.AddDbContext<MyDBContext>(options =>
            options.UseNpgsql(Configuration.GetConnectionString("MyDatabaseString"), x => x.UseNetTopologySuite()) );
Run Code Online (Sandbox Code Playgroud)