我的MongoDB中有数据存储可空的int,通常为null。我在C#端的模型的变量为int? MaterialID
。
当我运行.Query.FirstOrDefault()
时,我收到错误“输入字符串的格式不正确。”每当它试图从Mongo读取空值时(整数工作正常)。
我设法通过改变我的int来解决这个问题?到一个字符串,然后再将其转换回一个int?,但这是一个我真的不喜欢的可怕的黑客攻击。任何人都有任何关于如何从Mongo读取null到我的int的想法?在C#方面?
感谢。
我的JSON:
"Collection" : {
"List" : [
{
"ID" : "40",
"StartDate" : ISODate("2013-01-01T00:00:00.000Z"),
"EndDate" : ISODate("2013-12-31T00:00:00.000Z"),
"MaterialID" : "3"
},
{
"ID" : "40",
"StartDate" : ISODate("2014-01-01T00:00:00.000Z"),
"EndDate" : ISODate("2014-09-30T00:00:00.000Z"),
"MaterialID" : "null"
}
]
答案 0 :(得分:1)
您将MaterialID字段存储为数据库中的字符串(类型2)。当然,当您尝试将字符串值分配给可空整数时,您会遇到错误。注意:偶数null
存储为带有文本"null"
的字符串。我建议您从修复数据库中的数据开始。你可以从mongo shell做到这一点:
> db.collection.find({MaterialID:{$type:2}}).forEach(
function(doc){
var materialId = (doc.MaterialID == "null") ? null : new NumberInt(doc.MaterialID);
db.collection.update({_id:doc._id},{$set:{MaterialID: materialId}});
})
注意:在你的json文档中没有_id字段,但我认为它在那里而不是ID字段。无论如何,您可以根据需要调整脚本。
更改字段类型后,映射到nullable int将正常工作。
BTW还有另一个选项,如果由于某种原因您无法修复数据库中的数据。你可以使用自定义BSON序列化器来转换int吗?字串,反之亦然:
public class NullableIntAsStringSerializer : SerializerBase<int?>
{
public override void Serialize(
BsonSerializationContext context, BsonSerializationArgs args, int? value)
{
context.Writer.WriteString(value.HasValue ? value.ToString() : "null");
}
public override int? Deserialize(
BsonDeserializationContext context, BsonDeserializationArgs args)
{
var str = context.Reader.ReadString();
return str == "null" ? (int?)null : Int32.Parse(str);
}
}
并将此序列化程序分配给您的属性
[BsonSerializer(typeof(NullableIntAsStringSerializer))]
public int? MaterialID { get; set; }