2012-11-10 6 views
8

Ich habe ein einfaches Objekt mit Getter und Setter erstellt:einfügen nicht erstellen 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; } 
} 

Jetzt möchte ich mit ein neues Mitglied in die Datenbank einzufügen:

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; 
} 

I Einsatz eine einzigartige _id zu schaffen erwarten würde (Id), aber das passiert nicht. Nach dem Einfügen, wenn ich das Feld _id sehe, bekomme ich "0000000 ...."

Was muss ich tun, damit Mongo seine eigene _id on insert erzeugt?

+1

Manchmal mag ich Fragen in Themen zu beantworten, von denen ich nichts weiß. Hier ist, was ich herausgefunden habe: Sie können IDs selbst generieren mit 'ObjectId.GenerateNewId()' - Sie können es im Konstruktor von 'MemberCanonical' tun, oder überprüfen Sie die ID beim Einfügen gegen' ObjectId.Empty'. Als nächstes ist es möglich * es sollte '_id' genannt werden, da bin ich mir nicht ganz sicher. Ich würde auch versuchen, 'ObjectId?' Zu verwenden und seinen Wert auf 'null' setzen, aber das ist eine wilde Vermutung. – Kobi

+0

Es erstellt die ID automatisch, wenn der ID-Typ ObjectId ist. was wie erwartet ist. Wenn die ID nicht ObjectId ist, weiß der Treiber nicht, wie er diese ID erstellt und eindeutig macht. Dies muss manuell erfolgen. –

+2

Hat jemand eine Lösung, die das Domänenmodell nicht mit Persistenzproblemen wie einer Abhängigkeit von MongoDB-Typen verschmutzt? – Kurt

Antwort

11

Markieren Sie einfach Ihre Id-Eigenschaft mit [BsonId] Attribut, und generierte ID-Wert wird da sein!

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

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

oder alternative Art und Weise, durch @Kobi vorgeschlagen: "Name Verwendung _id Feld anstelle von Id" sollte auch funktionieren.

+1

Ich habe gerade das Attribut [BsonId] für meine Id-Eigenschaft verwendet, und ich habe keinen automatisch generierten ID-Wert erhalten. Meine Id-Eigenschaft ist jedoch eine Zeichenfolge. Würdest du zufällig wissen, ob es vom Typ ObjectId sein muss? –

+0

Übrigens, die Id-Eigenschaft wurde aktualisiert, wenn sie vom Typ 'ObjectId' war und * ohne * das' BsonId'-Attribut hatte. –

-1

Verwenden Sie [BsonId] für die eindeutige Eigenschaft, die Sie verwenden möchten. Sie können sogar den ObjectID Typ ignorieren und Ihren eigenen erstellen.

Zum Beispiel:

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

Das ist identisch mit einer Antwort von vor zwei Jahren. –

4

Ich benutze eine Kombination aus dem [BsonId] Attribute und der Konstruktor den ID-Wert zu erstellen.

Zum Beispiel

public class Something { 

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

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

} 

Dies ist so, dass ich immer ein besiedeltes Id-Feld für das Objekt haben. Wenn die Entität aus der Datenbank abgerufen wird, wird das ID-Feld mit dem tatsächlichen ID-Wert aus der Datenbank überschrieben. Gewinne gewinnen.