This question is sequel of BreezeSharp - ExecuteQuery fails with NullReferenceExeption
In my server side entity I have enum property:
[Required]
public DataStore DataStore { get; set; }
This property in client side entity is defined like this:
public DataStore DataStore
{
get { return GetValue<DataStore>(); }
set { SetValue(value);
}
When controller method return data to client, serialization error occur: "Input string was not in a correct format."
Here is StackTrace:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
at System.Convert.ToInt32(Object value, IFormatProvider provider)
at Newtonsoft.Json.Linq.JToken.op_Explicit(JToken value)
at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType)
at Breeze.Sharp.JsonEntityConverter.<>c__DisplayClassa.<ParseObject>b__6(KeyValuePair`2 kvp) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 195
at Breeze.Sharp.Core.EnumerableFns.ForEach[T](IEnumerable`1 items, Action`1 action) in c:\GitHub\breeze.sharp\Breeze.Sharp\Core\EnumerableFns.cs:line 35
at Breeze.Sharp.JsonEntityConverter.ParseObject(NodeContext nodeContext, EntityAspect targetAspect) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 180
at Breeze.Sharp.JsonEntityConverter.PopulateEntity(NodeContext nodeContext, IEntity entity) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 152
at Breeze.Sharp.JsonEntityConverter.CreateAndPopulate(NodeContext nodeContext) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 143
at Breeze.Sharp.JsonEntityConverter.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer) in c:\GitHub\breeze.sharp\Breeze.Sharp\JsonEntityConverter.cs:line 82
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
When I exclude DataStore property from model, everything is working fine. It looks like that BreezeSharp is trying to parse enum as int.
I tried defining client side property as string, but that raises InconsistentCLRPropertyDefinition metadata mismatch. I also tried defining client side property like this:
public DataStore DataStore { get { var dataStore = this.GetValue("DataStore"); return DataStore.DEV; } set { this.SetValue(value); } } But issue occurs before get is hit.
I looked at JsonEntityConverter.cs, and it looks like that enum is not handled separately at this point:
private void ParseObject(NodeContext nodeContext, EntityAspect targetAspect) {
// backingStore will be null if not allowed to overwrite the entity.
var backingStore = (targetAspect == null) ? null : targetAspect.BackingStore;
var dict = (IDictionary<String, JToken>) nodeContext.Node;
var structuralType = nodeContext.StructuralType;
// needs to be the current namingConvention
var nc = _mappingContext.EntityManager.MetadataStore.NamingConvention;
dict.ForEach(kvp => {
var key = nc.ServerPropertyNameToClient(kvp.Key, structuralType);
var prop = structuralType.GetProperty(key);
if (prop != null) {
if (prop.IsDataProperty) {
if (backingStore != null) {
var dp = (DataProperty)prop;
if (dp.IsComplexProperty) {
var newCo = (IComplexObject) kvp.Value.ToObject(dp.ClrType);
var co = (IComplexObject)backingStore[key];
var coBacking = co.ComplexAspect.BackingStore;
newCo.ComplexAspect.BackingStore.ForEach(kvp2 => {
coBacking[kvp2.Key] = kvp2.Value;
});
} else {
backingStore[key] = kvp.Value.ToObject(dp.ClrType);
}
Does anyone has idea where to proceed from here?