4 votes

Comment puis-je définir les options de sérialisation pour les valeurs géographiques en utilisant le pilote C# officiel de 10gen ?

Envisager cette classe :

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; }
    }
}

J'ai un index géospatial sur l'ensemble des collections, comme suit { Geo: "2d" } . Malheureusement, le pilote essaie de stocker les coordonnées lat/lon sous forme de chaînes, au lieu de nombres, et j'obtiens l'erreur suivante Tue Mar 15 16:29:22 [conn8] insert database.locations exception 13026 geo values have to be numbers : { Lat : "50.0853779", Long : "19.931276700000012" } 1ms . Pour pallier ce problème, j'ai établi une carte comme suit :

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

Remarquez qu'il n'y a pas de BsonType.Decimal ni rien de tel. Dans l'effet, en essayant d'appeler Save() Je reçois un MongoDB.Bson.TruncationException ce qui semble logique. Quelles sont mes options ?

5voto

Andrew Orsich Points 24503

Selon cette bug(fixed Jan 21 2011 05:46:23 AM UTC) Dans le pilote officiel c#, la capacité "AllowTruncation" a été ajoutée. Vous devez donc télécharger la dernière version du pilote et en profiter ! De plus, au lieu de SetRepresentation, vous pouvez utiliser BsonRepresentationAttribute comme ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X