2011-02-03 6 views
24

J'utilise le lecteur officiel MongoDB C# v0.9.1.26831, mais je me demandais étant donné une classe POCO, est-il de toute façon ignorer certaines propriétés d'être inséré.Pilote MongoDB C#: Ignorer la propriété sur l'insertion

Par exemple, j'ai la classe suivante:

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

Est-il possible, pour le IsOwner pour obtenir pas inséré lors de l'insertion d'un objet GroceryList? Fondamentalement, je récupère l'objet à partir de la base de données puis définissez la propriété IsOwner dans la couche de l'application, puis le renvoyer au contrôleur, qui mappe l'objet à un modèle de vue.

J'espère que ma question est logique. Merci!

+0

Avez-vous résolu votre problème? –

+0

Oui, j'ai utilisé l'attribut BsonIgnore sur la propriété IsOwner et cela a résolu le problème. Merci! – Abe

Répondre

35

Il semble que l'attribut [BsonIgnore] a fait le travail.

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

bien, sauvé ma journée, merci. –

13

vous pouvez également faire IsOwner Nullable et ajoutez [BsonIgnoreExtraElements] à la classe de trous:

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

propriété avec la valeur NULL sera ignorée pendant searilization. Mais je pense que [BsonIgnore] sera meilleur pour votre cas.

+0

si j'utilise à la fois [BsonIgnoreExtraElements] et [BsonIgnore] alors toutes les propriétés ayant une annotation [BsonIgnore] ignoreraient non sans tenir compte des valeurs alors que le reste ayant des valeurs nulles serait également ignoré. Correct? – WSK

+0

@WSK [BsonIgnoreExtraElements] ignore les champs de DB qui ne sont pas dans votre classe lors du chargement d'un document. BsonIgnore ignorer le champ lors du chargement/enregistrement d'un document. –

4

Sinon, si vous ne voulez pas utiliser l'attribut pour une raison quelconque (par exemple dans le cas où vous ne voulez pas apporter une dépendance supplémentaire à MongoDB.Bson à votre DTO), vous pouvez effectuer les opérations suivantes:

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

Juste au cas où quelqu'un pourrait être intéressé par une autre façon de le faire. Via conventions:

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

Et puis vous devez vous inscrire cette convention une fois lors de votre démarrage de l'application:

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

Vous devriez probablement vouloir combiner les deux attributs BsonIgnoreExtraElements et BsonIgnore. La raison en est que BsonIgnore n'insère pas la propriété "IsOwner" dans votre base de données, mais si vous avez des "anciennes" instances dans votre base de données contenant ce champ et que vous supprimez ces champs de votre modèle dans la fonction GroceryList "classe et utiliser votre nouvelle classe dans la DB obtiendrez une exception:

" Element 'IsOwner' ne correspond à aucun champ ou propriété de classe. "

Une autre façon (au lieu de vous classe modèle d'édition) est d'utiliser « registre classe Carte » avec « SetIgnoreExtraElements » et « UnmapMember » ensemble.

Dans votre cas, il suffit d'ajouter ce code lorsque vous initialisez votre pilote:

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

Vous pouvez en savoir plus sur Mongo Class Mapping dans:

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

Questions connexes