es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Operaciones CRUD de Entity Framework con el objeto de geometría de Openlayers.

Estoy utilizando Openlayers e intentando guardar la información de geometría en mi base de datos.

Cuando dibujo un polígono en el mapa de Openlayers, el objeto (característica) generado tiene este formato:

{ “type”: “Polygon”, “coordinates”: [ [ [ 54.86572265625, 74.0013854318592 ], [ 53.59130859375, 73.62159408606237 ], [ 53.96484375, 73.16953636227885 ], [ 55.986328125, 73.59679245247814 ] ] ] }

El objeto anterior tiene 2 propiedades. {tipo: cadena, coordenadas: alguna matriz anidada}

Estoy pasando este objeto a mi API para guardarlo en la base de datos. Pero estoy teniendo problemas para definir el tipo de propiedad de coordenadas.

Básicamente es del tipo float[][][] por lo que creé mi clase de modelo EF de la siguiente manera:

public class Geometry
{
public string Type { get; set; }
public float[][][] Coordinates { get; set; }
}

Cuando intento obtener/actualizarlo, EF está arrojando el siguiente error:

“The property ‘Geometry.Coordinates’ could not be mapped, because it is of type ‘float[][][]’ which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it using the ‘[NotMapped]’ attribute or by using ‘EntityTypeBuilder.Ignore’ in ‘OnModelCreating’.”

El error está claro. EF no puede mapear estos tipos no soportados por sí solo. ¿Cómo puedo definir un mapeo explícitamente? ¿O hay alguna forma de hacerlo funcionar? ¿Es el tipo float[][][] correcto?

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema, necesitas definir un tipo de dato personalizado para asignar el tipo de datos float [][][] a un tipo de entidad compatible. Para ello, puedes utilizar el tipo DbGeometry del espacio de nombres System.Data.Entity.Spatial.

    Aquí tienes un ejemplo de cómo definir la clase Geometry utilizando el tipo DbGeometry:

    using System.Data.Entity.Spatial;
    
    public class Geometry
    {
        public string Type { get; set; }
    
        public DbGeometry Coordinates { get; set; }
    }
    

    Para asignar la propiedad de coordenadas al tipo DbGeometry, puedes utilizar el siguiente código en tu EntityTypeConfiguration:

    modelBuilder.Entity<geometry>()
        .Property(g => g.Coordinates)
        .HasColumnType("geometry");
    

    Esto le indicará a EF que asigne la propiedad de coordenadas al tipo de geometría en la base de datos.

    Luego, puedes utilizar el siguiente código para convertir las coordenadas al tipo DbGeometry antes de guardarlas en la base de datos:

    using System.Data.Entity.Spatial;
    
    var geom = DbGeometry.PolygonFromText(
        $"POLYGON(({string.Join(",", coordinatesString)})")", 4326);
    

    Donde coordinatesString es una lista de cadenas de coordenadas en el formato “lon lat” separadas por ‘,’.

    Finalmente, puedes guardar el objeto en la base de datos utilizando los métodos estándar de EF:

    dbContext.Geometries.Add(geometry);
    dbContext.SaveChanges();
    

    Esto debería resolver el problema y permitirte guardar la información de geometría en tu BD utilizando OpenLayers.

Comments are closed.