2012-05-23 35 views
0

我在Mongo-C#环境中,我们一直在使用Mongo 1.3.x DLL对Mongo进行编码。最近,我已将其更新为1.4.2和其他一切都很正常,直到我遇到一个问题,我注意到,虽然蒙戈DLL的旧版本是治疗更新Mongo驱动程序后Update.Setwrap中的空引用异常

update.SetWrapped(property.Name, value); 

所有文件时值为空,但最近的版本则不喜欢它,它抛出nullreference异常。

这里的问题是,我希望它能够接受空值。有没有人遇到过这个问题?如果是的话,你是怎么处理的?

回答

1

引入时发生了突变。你需要为此使用BsonNull.Value。所以,你的代码应该是这样的:

update.SetWrapped(property.Name, BsonValue.Create(value) ?? BsonNull.Value); 
+0

感谢克雷格......我看到了它的网站上....我不知道有什么可以是一个可能的原因是他们明确吗?它赚了什么? – TeaLeave

+1

嗯,在内部,.NET null的处理方式与BsonNull.Value不同。它们在语义上意味着不同的事物,并且在某些情况下可能是不明确的。所以,有一些规则会在下一个版本中得到澄清(1.5)。 1)使用BsonDocument(无类型文档)时,null是非法的。 2)在使用类(键入文档)时,null被映射到BsonNull。 –

0

我相信你应该已经能够C#空传递给Update.SetWrapped < T>,因为T是一个POCO,而不是一个BsonValue和串行对于T将决定如何序列化C#null。

我创建了一个JIRA票这样的:

https://jira.mongodb.org/browse/CSHARP-486

注意,虽然比1.4更早C#版本的驱动程序没有抛出一个NullReferenceException,他们还没有更新的财产,以BSON null作为你可能已经期望了(将C#null传递给SetWrapped将SetWrapped在早期版本中转换为no-op)。

为C#空处理的基本规则是明确的:

  1. C#null不是一个有效的BsonValue,使用BsonNull.Value代替
  2. C#空有效期为波苏斯,并可能会被序列化为BSON空(虽然技术上的POCO串行器可以选择不同的表示)
相关问题