Я делаю проект на 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 . Но я все еще получаю ту же ошибку:
Для типа объекта «Геометрия» требуется определить первичный ключ.
Кто-нибудь пробовал? Пожалуйста, я буду признателен за любую рекомендацию.