2012-11-10 10 views
8

Ho creato un semplice oggetto con getter e setter:inserire non creare 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; } 
} 

Ora voglio inserire un nuovo membro nel database con:

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

mi aspetterei inserto per creare un _id unico (Id), ma non sta succedendo. All'inserimento quando visualizzo il campo _id viene visualizzato "0000000 ...."

Cosa devo fare per consentire a Mongo di generare il proprio _id su insert?

+1

A volte mi piace rispondere a domande in argomenti di cui non so nulla. Ecco cosa ho scoperto: Puoi generare ids tu stesso usando 'ObjectId.GenerateNewId()' - Puoi farlo nel costruttore di 'MemberCanonical', o controllare l'Id durante l'inserimento contro' ObjectId.Empty'. Successivamente, è * possibile * dovrebbe essere chiamato '_id', non ne sono del tutto sicuro. Cercherò anche di usare 'ObjectId? 'E impostare il suo valore su' null', ma questa è una supposizione selvaggia. – Kobi

+0

Crea automaticamente l'Id quando Id type è ObjectId. che è come previsto. Se Id non è il driver ObjectId non saprà come creare quell'Id e renderlo univoco. Questo deve essere fatto manualmente. –

+2

Qualcuno ha una soluzione che non richiede di inquinare il modello di dominio con problemi di persistenza come una dipendenza dai tipi MongoDB? – Kurt

risposta

11

Contrassegna semplicemente la proprietà Id con l'attributo [BsonId] e il valore ID generato sarà lì!

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

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

o alternativo modo, suggerito da @Kobi: "L'uso _id nome del campo al posto di Id" dovrebbe anche funzionare.

+1

Ho appena usato l'attributo [BsonId] sulla mia proprietà Id e non ho ottenuto un valore ID generato automaticamente. La mia proprietà Id è una stringa, però. Vuoi sapere se deve essere di tipo ObjectId? –

+0

A proposito, la proprietà Id è stata aggiornata quando era di tipo 'ObjectId' e * without * con l'attributo' BsonId'. –

-1

Utilizzare [BsonId] su qualsiasi proprietà univoca che si desidera utilizzare. Puoi persino ignorare il tipo ObjectID e crearne uno tuo.

Ad esempio:

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

Questo è identico a una risposta di due anni fa. –

4

io uso una combinazione dell'attributo [BsonId] e il costruttore per creare il valore Id.

Ad esempio

public class Something { 

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

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

} 

Questo è così che ho sempre un campo ID popolata per l'oggetto. Quando l'entità viene recuperata dal database, il campo Id viene sovrascritto con il valore Id effettivo dal database. Vinci Win.

Problemi correlati