2011-05-19 44 views
24

如果我想用一个POCO如何使用POCO用MongoDB的C#驱动程序时,管理_id场

public class Thingy 
{ 
    public string Foo {get;set;} 
} 
... 
coll.Insert(new Thing(Foo = "hello")); 

读写蒙戈数据。当我读回我得到一个失败说_id是一个意外的属性(它是)。于是我添加了一个名为_id的字段给这个类。现在插入不工作,说_id字段不能为空。一个尝试过的BsonIgnoreIfNull属性,没有奏效。

回答

50

当您插入一个对象时,如果它没有_id字段,则该驱动程序将添加一个对象,并将其设置为一个12字节的MongoDB ObjectId值。

你只需要一个Id属性添加到您的POCO,将从_id被deserialised:

public class Thingy 
{ 
    public ObjectId Id { get; set; } 
} 

或者,如果你想委托其他属性映射到_id那么你可以装饰它与BsonIdAttribute,就像这样:

[BsonId] 
public ObjectId MyKey { get; set; } 

_id字段不必须是一个MongoDB的ObjectId,您可以将其设置为任何数据类型的任何值(除一个数组),它只需要在集合中是唯一的。

+3

+1表示可以将_id设置为任何数据类型的任何值(数组除外)的最终解释。我对这一点的官方文档 – s0nica 2012-08-13 13:08:01

+0

[explitive] [explitive] [explitive]有点困惑,一直与此战斗2天。谢谢@Chris Fulstow,这是一个晦涩难懂的关键特征! – 2015-11-20 17:02:18

0

添加属性,如下所示:

public BsonObjectId Id { get; set; } 

MongoDB的驱动程序会自动序列化\ deserializtion期间转换Id_id

+0

thx - 我有一种感觉,有一组文档,样本或我失踪的东西:-) – pm100 2011-05-19 20:06:07

+1

@Bryan Migliorisi - 这是行不通的。插入(或保存)失败告诉我,Id不能为空 – pm100 2011-05-19 20:29:43

+0

您正在使用哪个驱动程序? – 2011-05-19 21:33:41

0
public class Thingy 
{ 
     public ObjectId Id { get; set; } 
     public string Foo { get; set; } 
} 

更多信息根据类

在需要的地方,使用下面的代码:

var collection = database.GetCollection<Thingy>("db_Thingy"); 
Thingy tg= new Thingy(); 
tg.Foo = "Hello"; 
collection.insert(tg); 
2

我一般包装啄:

public class MongoThingy 
{ 
    public ObjectId Id { get; set; } 
    public Thingy Thingy { get; set; } 
} 

它使很多比较容易,因为Thingy的课堂往往来自一个我无法控制的图书馆。反序列化也更容易,以便将其交给其他人进行处理。

相关问题