使用Entity Framework与PostGIS的Geometry类型

3

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

一切都进行得很顺利,就是有一件事情。每当我尝试添加一个新的脚手架控制器(当然,先添加了我的模型),我就会遇到以下错误:

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

这是不言自明的;我有一个具有Geometry类型(来自Postgis)的模型类,似乎会对Entity Framework造成问题。

我做了什么?

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

值得一提的是,我在生成我的模型之前也添加了NetTopologySuite包,就像教程中所提到的一样。尽管NTS确实支持Geometry,但每当我尝试使用Entity Framework添加一个脚手架API控制器时,我都会遇到上述错误。

为了进一步参考,这里是错误提到的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; }
    }
}

我还在DB上下文中添加了x => x.UseNetTopologySuite()。有人知道我做错了什么吗?错误提示中提到可以添加[NotMapped]属性,但我确实希望该属性被映射。
谢谢提前! 编辑:手动创建控制器(而不是通过脚手架),可以运行且不会出现错误,但如果尝试访问任何控制器端点的路由,则最终会出现相同的错误消息。
1个回答

5

问题已解决。事实证明,我不仅需要在DB上下文文件中包含x => x.UseNetTopologySuite(),还需要在Startup.cs文件中包含。呃!

services.AddDbContext<MyDBContext>(options =>
            options.UseNpgsql(Configuration.GetConnectionString("MyDatabaseString"), x => x.UseNetTopologySuite()) );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接