【问题标题】:Using Postgis' Geometry type with Entity Framework在实体框架中使用 Postgis 的几何类型
【发布时间】:2020-12-25 11:06:52
【问题描述】:

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

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

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

这是不言自明的;我有一个具有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; }
    }
}

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

提前致谢!

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

【问题讨论】:

    标签: c# asp.net entity-framework geometry postgis


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2021-06-28
      • 2011-09-16
      相关资源
      最近更新 更多