2014-05-03 8 views
31

Gibt es bei Verwendung von FindOne() mit MongoDB und C# eine Möglichkeit, Felder zu ignorieren, die nicht im Objekt gefunden werden?MongoDB C# -Treiber - Felder bei Bindung ignorieren

EG, Beispielmodell.

Jetzt speichern wir auch ein Passwort in der MongoDB Sammlung, aber wollen es nicht an obiges Objekt binden. Wenn wir bekommen ein wie so,

var query = Query<UserModel>.EQ(e => e.Email, model.Email); 
    var entity = usersCollection.FindOne(query); 

Wir erhalten die folgenden Fehler

Element 'Password' does not match any field or property of class 

gibt es sowieso Mongo zu sagen, Felder zu ignorieren es mit den Modellen Übereinstimmen kippt?

Antwort

58

Ja. Nur dekorieren Sie Ihre UserModel Klasse mit dem Attribut BsonIgnoreExtraElements:

[BsonIgnoreExtraElements] 
public class UserModel 
{ 
    public ObjectId id { get; set; } 
    public string Email { get; set; } 
} 

Wie der Name schon sagt, würde ignorieren die Fahrer keine zusätzlichen Felder stattdessen eine Ausnahme zu werfen.

+1

@ l3arnon Dies kann global gesetzt werden? – LiamB

+4

Es kann global mit einer Konvention festgelegt werden, wie hier beschrieben: https://jira.mongodb.org/browse/CSHARP-965. Zusätzliche Elemente werden standardmäßig nicht ignoriert, da Daten verloren gehen und das nicht sicher ist. –

6

Ja. Eine weitere Möglichkeit (statt Sie Modellklasse der Bearbeitung) ist „Register Klasse Karte“ mit „SetIgnoreExtraElements

In Ihrem Fall verwenden nur diesen Code hinzufügen, wenn Sie Ihre Treiber initialisieren:

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

Sie können mehr über Mongo Class Mapping lesen:

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

2

Noch eine andere mögliche Lösung ist eine con registrieren Erfindung dafür.

Auf diese Weise müssen wir nicht alle Klassen mit [BsonIgnoreExtraElements] annotieren.

Irgendwo bei der Mongo-Client erstellen, richten Sie die folgenden Schritte aus:

 var pack = new ConventionPack(); 
     pack.Add(new IgnoreExtraElementsConvention(true)); 
     ConventionRegistry.Register("My Solution Conventions", pack, t => true); 
+0

Danke .. das hat mir sehr geholfen, meine Poco's nicht mit der ObjectId zu dekorieren. Auf diese Weise habe ich einen sauberen Datenvertrag ohne irgendwelche Mongo-spezifischen Abhängigkeiten. – Pascalsz