使用POCO和mongodb c#驱动程序时如何管理_id字段
如果我想用POCO读写mongo数据
public class Thingy { public string Foo {get;set;} } ... coll.Insert(new Thing(Foo = "hello"));
当我回读时,我得到一个失败,说_id是一个意外的属性(它是)。 然后我在课堂上添加了一个名为_id的字段。 现在插入不起作用,说_id字段不能为null。 一个尝试过的BsonIgnoreIfNull属性,它没有用。
插入对象时,如果它没有_id
字段,则驱动程序会添加一个并将其设置为12字节的MongoDB ObjectId值。
您只需要向POCO添加Id
属性,该属性将从_id
反序列化:
public class Thingy { public ObjectId Id { get; set; } }
或者,如果您想委托另一个属性映射到_id
那么您可以使用BsonIdAttribute
来装饰它,如下所示:
[BsonId] public ObjectId MyKey { get; set; }
_id
字段不必是MongoDB ObjectId
,您可以将其设置为任何数据类型的任何值(数组除外),它只需要在集合中是唯一的。
您必须为id添加属性(或字段)并告诉序列化程序您要使用哪个id生成器。
[BsonId(IdGenerator = typeof(ObjectIdGenerator))] public object ThingyId { get; set; }
MongoDb驱动程序中有3个可用,或者您可以编写自己的驱动程序。 更多信息, 请访问http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator
我一般包裹着Thingy:
public class MongoThingy { public ObjectId Id { get; set; } public Thingy Thingy { get; set; } }
这使得它变得更容易,因为Thingy类通常来自一个我无法控制的不同库。 反序列化也更容易,以便将其移交给其他人进行处理。
添加属性如下:
public BsonObjectId Id { get; set; }
MongoDB驱动程序在序列化\ _id
期间自动将Id
转换为_id
。
public class Thingy { public ObjectId Id { get; set; } public string Foo { get; set; } }
根据上课
如果需要,请使用以下代码:
var collection = database.GetCollection("db_Thingy"); Thingy tg= new Thingy(); tg.Foo = "Hello"; collection.insert(tg);