2011-05-19 48 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的課堂往往來自一個我無法控制的圖書館。反序列化也更容易,以便將其交給其他人進行處理。

相關問題