2014-12-09 13 views
5

Sto costruendo un'API Web vata OD3 con il codice Entity Framework 6.0.Problema di serializzazione DbGeometry in Asp.net web api

Tutto funziona correttamente e posso eseguire operazioni CRUD sul server API.

Tuttavia sto usando Tipi spaziali e alcune delle mie entità hanno proprietà DbGeometry. Quando cerco di aggiornare/inserire un soggetto con un tipo di DbGeometry da un'applicazione client (solo una console per le prove) ottengo questo DataServiceRequestException:

Nessun costruttore senza parametri definiti per questo oggetto.

Mi ci è voluto un po 'ma ho identificato il tipo DbGeometry come responsabile. Ho già guardato this topic here e feci una consuetudine JsonConverter, dove ho applicato alla proprietà:

[Required] 
[JsonConverter(typeof(DbGeometryConverter))] 
[Column("geometria")] 
public DbGeometry Geometria { get; set; } 

che non ha funzionato. L'oggetto non è deserializzato sul server Web API a meno che non rimuova la proprietà DbGeometry.

Ho anche provato a modificare il comportamento globale JSON serializzatore

var formatters = GlobalConfiguration.Configuration.Formatters; 
var jsonFormatter = formatters.JsonFormatter; 
jsonFormatter.SerializerSettings.Converters.Add(new DbGeometryConverter()); 

anche inutile. Ho davvero bisogno delle proprietà DbGeometry. Cos'altro posso fare per aggirare questo problema?

+0

Cosa si ottiene portando l'attributo Geometria come oggetto? Alla fine avrebbe funzionato per portare l'oggetto e fare la conversione in un Mapper. – Custodio

+0

Hai trovato qualche soluzione a questo problema? –

risposta

0

Un po 'tardi, ma per coloro che ti cercano una risposta:

Sono riuscito a farlo con lo stesso identico codice su un livello di controller. L'idea è stata presa da questo SO Question&Answer.

Quindi, ecco il codice incluso DbGeometryConverter.

DbGeometryConverter.cs:

public class DbGeometryConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType.IsAssignableFrom(typeof(DbGeometry)); 
    } 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var location = JObject.Load(reader); 
     var token = location["Geometry"]["WellKnownText"]; 
     string geom = token.ToString(); 

     token = location["Geometry"]["CoordinateSystemId"]; 
     int srid = token != null ? int.Parse(token.ToString()) : 0; 
     var converted = DbGeometry.FromText(geom, srid); 
     return converted; 
    } 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanWrite => false; 
} 

CustomJsonAttribute.cs:

public class CustomJsonAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor) 
    { 
     var formatter = controllerSettings.Formatters.JsonFormatter; 
     formatter.SerializerSettings.Converters.Add(new DbGeometryConverter()); 
    } 
} 

E [CustomJson] attributo su un controller che utilizza DbGeometry.