使用POCO和mongodb c#驱动程序时如何管理_id字段

时间:2011-05-19 18:29:39

标签: c# mongodb poco

如果我想用POCO读取和编写mongo数据

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

当我回读时,我得到一个失败,说_id是一个意外的属性(它是)。然后我在课堂上添加了一个名为_id的字段。现在插入不起作用,说_id字段不能为null。一个尝试过的BsonIgnoreIfNull属性,它没有用。

5 个答案:

答案 0 :(得分:56)

当您插入对象时,如果它没有_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,您可以将其设置为任何数据类型的任何值(数组除外),它只需要在集合中是唯一的

答案 1 :(得分:9)

您必须为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

答案 2 :(得分:2)

我通常包裹着Thingy:

class MeasurementUnit(Base):
    __tablename__ = "measurement_units"
    id = Column(Integer, primary_key=True)
    code = Column(String, unique=True)
    long_name = Column(String)
    siunitx = Column(String)

它使得它变得更容易,因为Thingy类经常来自我无法控制的不同库。它也更容易反序列化,以便将其移交给其他人进行处理。

答案 3 :(得分:1)

添加如下属性:

public BsonObjectId Id { get; set; }

MongoDB驱动程序会在序列化\反序列化期间自动将Id转换为_id

答案 4 :(得分: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);