Indagamos en distintos sitios para de esta forma mostrarte la solución para tu duda, en caso de inquietudes puedes dejar tu inquietud y te respondemos con mucho gusto, porque estamos para ayudarte.
Solución:
MongoDB no admite correctamente decimales hasta MongoDB v3.4. Antes de esta versión, almacenaba decimales como cadenas para evitar errores de precisión.
Anterior v3.4
Almacene decimales como cadenas, pero esto evita las operaciones aritméticas. Operadores como $min
, $avg
, … no estará disponible. Si la precisión no es gran cosa, es posible que pueda cambiar a double
.
v3.4+
Debe asegurarse de que se cumplen las siguientes condiciones previas true:
- El servidor MongoDB debe ser al menos v3.4.
- MongoCSharpDriver debe ser al menos v2.4.3.
- La base de datos debe tener
featureCompatibilityVersion
ajustado a'3.4'
. Si su base de datos ha sido creada por una versión anterior de MongoDB y ha actualizado su servidor a v3.4, es posible que su base de datos aún esté en una versión anterior.
Si tiene todas las propiedades configuradas, registre los siguientes serializadores para usar el decimal128
tipo:
BsonSerializer.RegisterSerializer(typeof(decimal), new DecimalSerializer(BsonType.Decimal128));
BsonSerializer.RegisterSerializer(typeof(decimal?), new NullableSerializer(new DecimalSerializer(BsonType.Decimal128)));
Recientemente me encontré con este problema. Lo resolví simplemente anotando mi objeto así:
[BsonRepresentation(BsonType.Decimal128)]
public decimal Price get; set;
Tuve problemas para usar el RegisterSerializer
enfoque ya que se quejó de que ya tenía un serializador registrado, pero una alternativa es escribir su propio proveedor de serialización y usarlo.
Aquí está el proveedor:
public class CustomSerializationProvider : IBsonSerializationProvider
private static readonly DecimalSerializer DecimalSerializer = new DecimalSerializer(BsonType.Decimal128);
private static readonly NullableSerializer NullableSerializer = new NullableSerializer(new DecimalSerializer(BsonType.Decimal128));
public IBsonSerializer GetSerializer(Type type)
if (type == typeof(decimal)) return DecimalSerializer;
if (type == typeof(decimal?)) return NullableSerializer;
return null; // falls back to Mongo defaults
que debe registrarse llamando
BsonSerializer.RegisterSerializationProvider(new CustomSerializationProvider());
valoraciones y comentarios
Si aceptas, tienes la habilidad dejar una noticia acerca de qué te ha gustado de este escrito.