Как установить параметры сериализации для значений гео, используя официальный драйвер 10gen C #? - PullRequest
4 голосов
/ 15 марта 2011

Учитывая этот класс:

public class Location
{
    public Coordinates Geo { get; set; }

    public Location()
    {
        Geo = new Coordinates();
    }

    public class Coordinates
    {
        public decimal Lat { get; set; }
        public decimal Long { get; set; }
    }
}

У меня есть набор геопространственных данных, например { Geo: "2d" }. К сожалению, драйвер пытается сохранить координаты широты / долготы в виде строк, а не чисел, и я получаю сообщение об ошибке: Вт 15 марта 16:29:22 [conn8] вставка исключения database.locations 13026 значения гео должны быть числами: {Lat: "50.0853779", Long: "19.931276700000012"} 1 мс . Чтобы решить эту проблему, я настроил карту так:

BsonClassMap.RegisterClassMap<Location.Coordinates>(cm =>
{
    cm.AutoMap();
    cm.MapProperty(c => c.Lat).SetRepresentation(BsonType.Double);
    cm.MapProperty(c => c.Long).SetRepresentation(BsonType.Double);
});

Обратите внимание, что нет BsonType.Decimal и ничего подобного. В результате при попытке вызвать Save() я получаю MongoDB.Bson.TruncationException, что кажется логичным. Какие у меня варианты?

1 Ответ

5 голосов
/ 15 марта 2011

Согласно этой ошибке (исправлено 21 января 2011 05:46:23 UTC) , в официальном драйвере c # была добавлена ​​возможность 'AllowTruncation'. Так что вам нужно скачать последнюю версию драйвера и наслаждайтесь! Также вместо SetRepresentation вы можете использовать атрибут BsonRepresentationAttribute следующим образом:

public class C {
  [BsonRepresentation(BsonType.Double, AllowTruncation=true)]
  public decimal D;
}
...