2012-11-10 29 views
8

我已創建了getter和setter方法的簡單對象:插入不創建ID?

public class MemberCanonical : IMemberCanonical 
{ 
    public ObjectId Id { get; set; } 
    public String username { get; set; } 
    public String email { get; set; } 
    public String status { get; set; } 
    public IEnumerable<string> roles { get; set; } 
} 

現在我要到一個新的成員插入到與數據庫:

try 
{ 
    memberObj.username = username; 
    memberObj.email = email; 
    memberObj.status = "active"; 
    // memberObj.Id = new ObjectId().ToString(); 
    this.membershipcollection.Insert(memberObj, SafeMode.True); 
    return true; 
} 
catch(Exception ex) 
{ 
    return false; 
} 

我希望插入創建一個獨特的_id( Id),但沒有發生。在插入時,當我查看_id字段時,我會得到「0000000 ....」

我需要做什麼才能讓Mongo在插入時生成它自己的_id?

+1

有時我喜歡回答我一無所知的科目中的問題。下面是我發現的:您可以使用ObjectId.GenerateNewId()自己生成id。您可以在MemberCanonical的構造函數中執行此操作,也可以在插入ObjectId.Empty時檢查Id。接下來,它是*可能*它應該被稱爲'_id',我對此不太確定。我也嘗試使用ObjectId?並將它的值設置爲null,但這是一個瘋狂的猜測。 – Kobi

+0

它在Id類型爲ObjectId時自動創建Id。這是預期的。如果Id不是ObjectId驅動程序將不知道如何創建該Id並使其唯一。因此,必須手動完成。 –

+2

有沒有人有一個解決方案,不需要通過持久性問題(如對MongoDB類型的依賴)來污染域模型? – Kurt

回答

11

只需用[BsonId]屬性標記您的Id屬性,並生成id值就會在那裏!

public class MemberCanonical : IMemberCanonical 
{ 
    [BsonId] 
    public ObjectId Id { get; set; } 

this.membershipcollection.Insert(memberObj, SafeMode.True); 
var idYouLookingFor = memberObj.Id; 

或者另一種方式,通過@Kobi建議: 「使用_id字段名稱,而不是ID」 也應該工作。

+1

我剛剛在我的Id屬性上使用了[BsonId]屬性,我沒有得到自動生成的ID值。不過,我的ID屬性是一個字符串。你會碰巧知道它是否必須是ObjectId類型? –

+0

順便說一下,Id屬性更新爲「ObjectId」類型,*不帶*具有「BsonId」屬性。 –

-1

使用[BsonId]您想要使用的任何獨特屬性。你甚至可以忽略ObjectID類型並創建你自己的。

例如:

[BsonId] 
public string studentid{get; set;} 
+1

這與兩年前的答案相同。 –

4

我使用[BsonId]屬性和構造函數創建的Id值的組合。

例如

public class Something { 

    [BsonId] 
    public string Id { get; set; } 

    public Something() { 
     this.Id = ObjectId.GenerateNewId().ToString(); 
    } 

} 

這是這樣,我總有一種填充的ID字段的對象。當從數據庫中檢索實體時,Id字段將被數據庫中的實際Id值覆蓋。贏贏。