Как передать поле типа «геометрия» в базе данных через API в .Net ⇐ C#

Место общения программистов C#
Anonymous
Как передать поле типа «геометрия» в базе данных через API в .Net

Сообщение Anonymous »

Ну, я хочу вернуть все записи из базы данных через API в приложении .NET.
Одно из полей, используемых таблицей, имеет тип геометрии, который дает мне конфликт. Я пробовал несколько библиотек, но все они выдают ошибку. Если можете помочь мне немного прояснить ситуацию, пожалуйста.
Приложение имеет шестиугольную архитектуру:
GeoRegionConfiguration:
using Core.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Infraestructure.Data.Configurations
{
internal class GeoRegionConfiguration : IEntityTypeConfiguration
{
public void Configure(EntityTypeBuilder builder)
{
builder.ToTable("Geo_Region", DataConstants.SCHEMA);

builder.HasKey(row => row.Id)
.HasName("PK_Geo_Region");

builder.Property(row => row.Id)
.IsRequired()
.HasColumnName("id")
.HasColumnType("int")
.ValueGeneratedOnAdd();

builder.Property(row => row.Nombre)
.IsRequired()
.HasColumnName("nombre")
.HasColumnType("nvarchar(250)");

builder.Property(row => row.Geometry)
.HasColumnName("geometry")
.HasColumnType("geometry"); // Define el tipo como 'geometry' en la base de datos
}
}
}

Сущность:
using NetTopologySuite.Geometries;

namespace Core.Entities
{
public class GeoRegion
{
public int Id { get; set; }
public string Nombre { get; set; }
public Geometry Geometry { get; set; } // Tipo Geometry de NetTopologySuite
}
}

Метод в службе:
public IQueryable GetAllGeoRegions(PaginationGeoRegionQueryFilter filter)
{
var geoRegions = _mapsRepository.GetAllGeoRegions();

// Proyecta Geometry como string WKT
var result = geoRegions.Select(q => new GeoRegionDto
{
Id = q.Id,
Nombre = q.Nombre,
Geometry = q.Geometry != null ? q.Geometry.AsText() : null
});

return result;
}

DTO:
namespace Core.DTOs.Community
{
public class GeoRegionDto
{
public int Id { get; set; }
public string? Nombre { get; set; }
public string? Geometry { get; set; } // Mantén Geometry como string en el DTO
}
}

С этим кодом в библиотеке, которую я использую, а именно: NetTopologySuite, я получаю эту ошибку при тестировании конечной точки:
: Infraestructure.Filters.GlobalExceptionFilter[0]
Ha ocurrido la siguiente excepción: The 'Geometry' property 'GeoRegion.Geometry' could not be mapped to the database type 'geometry' because the database provider does not support mapping 'Geometry' properties to 'geometry' columns. Consider mapping to a different database type or converting the property value to a type supported by the database using a value converter. See https://aka.ms/efcore-docs-value-converters for more information. Alternately, exclude the property from the model using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'. - at Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.ThrowPropertyNotMappedException(String propertyType, IConventionTypeBase typeBase, IConventionProperty unmappedProperty)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.g__Validate|7_0(IConventionTypeBase typeBase, c__DisplayClass7_0&)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidatePropertyMapping(IModel model, IDiagnosticsLogger`1 logger)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
at Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
at Microsoft.EntityFrameworkCore.SqlServer.Infrastructure.Internal.SqlServerModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelRuntimeInitializer.Initialize(IModel model, Boolean designTime, IDiagnosticsLogger`1 validationLogger)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, ModelCreationDependencies modelCreationDependencies, Boolean designTime)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel(Boolean designTime)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.c.b__8_4(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInject


Подробнее здесь: https://stackoverflow.com/questions/791 ... -an-api-in

Вернуться в «C#»