Как создать столбец DbGeometry в таблице в C #, используя Entity Framework Core для работы с PostGis - PullRequest
0 голосов
/ 29 июня 2018

Я делаю проект на C #, где мне нужно создать несколько таблиц, чтобы использовать PostGis для вычисления расстояний между различными объектами. Я создал объект, используя EntityFramework. Чтобы рассчитать расстояния, я добавил к объекту широту, долготу и объект Geometry, который использует Postgis. Тип геометрии Postigis будет в C # типа System.Data.Entity.Spatial.DbGeometry в соответствии с этой документацией:

https://www.devart.com/dotconnect/postgresql/docs/DataTypeMapping.html#n3

DbGeometry получается добавлением EntityFramework (v6.2.0 в моем случае) в наш проект. Это код таблицы, которую я хочу создать:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
using System.Drawing;

namespace netCore_Proj.Models
{
    [Table("House", Schema = "public")]
    public class House: EntityBase
    {
        public House()
        {
            this.Photos = new List<PhotosEntity>();
        }
        public string Title { get; set; }
        public string Price { get; set; }
        public int? ZipCode { get; set; }
        public string ExteriorColor { get; set; }
        public string InteriorColor { get; set; }
        public virtual List<PhotosEntity> Photos { get; set; }
        public string Description { get; set; }
        public string OwnerName { get; set; }
        public string OwnerPhone { get; set; }
        public string FullDescription { get; set; }
        public string ContactEmail { get; set; }
        [NotMapped]
        public string Thumbnail { get; set; }
        [NotMapped]
        public string ImagePreview { get; set; }
        [NotMapped]
        public List<string> SliderImages { get; set; }
        [NotMapped]
        public List<string> MainImages { get; set; }
        [NotMapped]
        public string Status { get; set; }
        public double Lat { get; set; }
        public double Lon { get; set; }
        public DbGeometry Geom { get; set; }
    }
}

Проблема в том, что когда я выполняю миграцию, я получаю сообщение об ошибке:

Тип сущности 'DbGeometry' требует определения первичного ключа.

Вот полное сообщение об ошибке:

System.InvalidOperationException: тип сущности 'DbGeometry' требует определения первичного ключа. в Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNul lPrimaryKeys (модель IModel) в Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate (IMode л модель) в Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Vali дата (модель IModel) в Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel (DbCon текстовый контекст, IConventionSetBuilder ConventionSetBuilder, IModelValidator валидатор) в Microsoft.EntityFrameworkCore.Infrastructure.ModelSource. <> C__DisplayClass 5_0.b__0 (Объект k) в System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Fu nc 2 valueFactory) в Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel (DbContex t context, IConventionSetBuilder ConventionSetBuilder, IModelValidator валидатор) в Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel () в Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model ()
в Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilde r. <> c.b__7_1 (IServiceProvider p) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeReso lver.VisitFactory (FactoryCallSite factoryCallSite, ServiceProvider поставщик) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.V isitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeReso lver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.V isitCallSite (IServiceCallSite callSite, аргумент TArgument) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeReso lver.VisitConstructor (ConstructorCallSite constructorCallSite, СервисПровидер Ровидер) на Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.V isitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeReso lver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.V isitCallSite (IServiceCallSite callSite, аргумент TArgument) в Microsoft.Extensions.DependencyInjection.ServiceProvider. <> C__DisplayClass 22_0.b__0 (поставщик ServiceProvider) в Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (Тип s erviceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService (поставщик IServiceProvider, тип serviceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions. GetRequiredService [T] (поставщик IServiceProvider) в Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies ()
в Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider () в Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infr astructure.IInfrastructure.get_Instance ()
в Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService [TService] (IInfrastructure 1 accessor) at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateCo ntext(Func 1 завод) в Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateCo ntext (String contextType) в Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigr ation (String name, String outputDir, String contextType) в Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl (Stимя кольца, String outputDir, String contextType) в Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration. <> C__D isplayClass0_1. <. ctor> b__0 () в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase. <> C__ DisplayClass3_0`1.b__0 () в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execu te (Действие действия) Тип сущности 'DbGeometry' требует первичного ключа подлежит определению.

Может кто-нибудь сказать мне, как я мог решить эту проблему?

Обновление автором поста

Поскольку DBGeometry и DBGeography объекты по-прежнему не поддерживаются Entity Frameworks Core , я видел на некоторых форумах, что возможно использовать пространственные объекты System.Spatial из OData .

Поэтому я заменил DBGeometry объект Entity Frameworks на Geometry объект OData . Но я все еще получаю ту же ошибку:

Для типа объекта «Геометрия» требуется определить первичный ключ.

Кто-нибудь пробовал? Пожалуйста, я буду признателен за любую рекомендацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...