2011-02-03 8 views
24

Sto usando l'unità ufficiale C# MongoDB v0.9.1.26831, ma mi chiedevo una classe POCO, c'è comunque da ignorare certe proprietà dall'inserimento.MongoDB C# Driver: Ignora proprietà su Insert

Per esempio, io ho la seguente classe:

public class GroceryList 
{ 
    public string Name { get; set; } 
    public FacebookList Owner { get; set; } 
    public bool IsOwner { get; set; } 
} 

Esiste un modo, per il IsOwner di non avere inserito quando inserisco un oggetto GroceryList? Fondamentalmente, prelevo l'oggetto dal database, quindi imposta la proprietà IsOwner nel livello dell'app e lo restituisco al controller, che esegue il mapping dell'oggetto a un modello di visualizzazione.

Spero che la mia domanda abbia un senso. Grazie!

+0

Forse hai risolto il tuo problema? –

+0

Sì, ho usato l'attributo BsonIgnore sulla proprietà IsOwner e questo ha risolto il problema. Grazie! – Abe

risposta

35

Sembra che l'attributo [BsonIgnore] abbia funzionato.

public class GroceryList : MongoEntity<ObjectId> 
{ 
    public FacebookList Owner { get; set; } 
    [BsonIgnore] 
    public bool IsOwner { get; set; } 
} 
+0

carino, ho salvato la giornata, grazie. –

13

Inoltre è possibile effettuare IsOwner Nullable e aggiungere [BsonIgnoreExtraElements] alla classe buco:

[BsonIgnoreExtraElements] 
public class GroceryList : MongoEntity<ObjectId> 
{ 
    public FacebookList Owner { get; set; } 
    public bool? IsOwner { get; set; } 
} 

proprietà con valore nullo saranno ignorate durante searilization. Ma penso che [BsonIgnore] sarà migliore per il tuo caso.

+0

se uso sia [BsonIgnoreExtraElements] che [BsonIgnore] tutte le proprietà con annotazione [BsonIgnore] ignorerebbero no indipendentemente da questi valori, mentre il resto con valori nulli verrebbero ignorati. Corretta? – WSK

+0

@WSK [BsonIgnoreExtraElements] ignora i campi da db che non è nella tua classe quando si carica un documento. BsonIgnore ignora il campo quando si carica/salva un documento. –

4

In alternativa, se non si desidera utilizzare l'attributo per qualche motivo (ad esempio, nel caso in cui non si vuole portare una dipendenza in più per MongoDB.Bson al vostro DTO), è possibile effettuare le seguenti operazioni:

BsonClassMap.RegisterClassMap<GroceryList>(cm => 
{ 
    cm.AutoMap(); 
    cm.UnmapMember(m => m.IsOwner); 
}); 
1

Nel caso in cui qualcuno potrebbe essere interessato a un altro modo di farlo. Via convenzioni:

public class IgnoreSomePropertyConvention : ConventionBase, IMemberMapConvention 
{ 
    public void Apply(BsonMemberMap memberMap) 
    { // more checks will go here for the case above, e.g. type check 
     if (memberMap.MemberName != "DoNotWantToSaveThis") 
      memberMap.SetShouldSerializeMethod(o => false); 
    } 
} 

e quindi è necessario registrare questa convenzione una volta durante l'avvio si app:

ConventionRegistry.Register("MyConventions", new ConventionPack { new IgnoreBaseIdConvention() }, t => true); 
1

probabilmente si dovrebbe desiderare di combinare i due attributi BsonIgnoreExtraElements e BsonIgnore. Il motivo è che BsonIgnore non inserirà la proprietà "IsOwner" nel DB ma se nel DB sono presenti istanze "vecchie" che contenevano questo campo e verranno rimossi i campi dal modello nella funzione o estenderli " GroceryList "classe e utilizzare la nuova classe nel DB otterrà un'eccezione:

" L'elemento 'IsOwner' non corrisponde a nessun campo o proprietà di classe. "

Un altro modo (invece di modificare voi classe del modello) è quello di utilizzare "Registrati Class Mappa" con "SetIgnoreExtraElements" e "UnmapMember" insieme.

Nel tuo caso basta aggiungere questo codice quando si inizializza il driver:

BsonClassMap.RegisterClassMap<UserModel>(cm => 
{ 
    cm.AutoMap(); 
    cm.SetIgnoreExtraElements(true); 
    cm.UnmapMember(m => m.IsOwner); 
}); 

Si può leggere di più su Mongo Class Mapping in:

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/