I am using the DbGeography-Type within a SinglePageApplication (with breeze and angular). Now when using the Data with the DbGeography-Type (readOnly) there is no problem.
As soon as I save an entity which has a property of DbGeography-Type I get the following error:
Error getting value from 'WellKnownValue' on 'System.Data.Entity.Spatial.DbGeography'
When the data is serialized to JSON (with newtonsoft JSON.NET or is it ODATA/WebAPI?), the DbGeography gets serialized correctly but the property "WellKownValue" is called "Geography". This is also reflected in the MSDN-Documentation:
[DataMemberAttribute(Name = "Geography")]
public DbGeographyWellKnownValue WellKnownValue { get; set; }
My entity looks like this (over the wire):
{
..
"Name" : "Test",
"Coordinate" : {
"$id" : "3",
"$type" : "System.Data.Entity.Spatial.DbGeography, EntityFramework",
"Geography" : {
"$id" : "4",
"$type" : "System.Data.Entity.Spatial.DbGeographyWellKnownValue, EntityFramework",
"CoordinateSystemId" : 4326,
"WellKnownText" : "POINT (8.73275400148029 47.5006958431132)"
}
}
}
I guess when it is deserialized at a later point, JSON.NET doesn't know that the Geography-Property of my object is acutally called WellKnownValue.
I am using the Newtonsoft.Json-Package version 7.0.1 and Microsoft.Data.OData version 5.6.4.
How can this problem be solved?
I found out (with .NET Reflector) that the DbGeography-Type can be instantiated by a default constructor (with no arguments) BUT this default constructor doesn't set some important private members (like _spatialProvider).
This results in a NullReferenceException when WellKnownValue-Getter is called during deserialization. So what I did is what many people before had to do (and I hoped didn't have to do) - I created a custom JsonConverter.
One speciality was, that I had to register it in BreezeWebApiConfig instead of the normal WebApiConfig:
And the converter: