web-dev-qa-db-fra.com

Pilote MongoDB C #: Ignorer la propriété lors de l'insertion

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 d'ignorer certaines propriétés de 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; }
}

Existe-t-il un moyen pour que IsOwner ne soit pas inséré lorsque j'insère un objet GroceryList? Fondamentalement, je récupère l'objet dans la base de données, puis je définis la propriété IsOwner dans la couche d'application, puis je la renvoie au contrôleur, qui mappe ensuite l'objet à un modèle de vue.

J'espère que ma question a du sens. Merci!

38
Abe

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

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

Alternativement, si vous ne voulez pas utiliser l'attribut pour une raison quelconque (par exemple, au 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);
});
16
iredchuk

Vous pouvez également rendre IsOwner Nullable et ajouter [BsonIgnoreExtraElements] à la classe de trous:

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

La propriété avec une valeur nulle sera ignorée pendant la recherche. Mais je pense que [BsonIgnore] sera mieux pour votre cas.

16
Andrew Orsich

Vous devriez probablement vouloir combiner les deux attributs BsonIgnoreExtraElements et BsonIgnore . La raison en est que BsonIgnore n'insérera pas la propriété "IsOwner" dans votre base de données, mais si vous avez des "anciennes" instances dans votre base de données qui contenaient ce champ et que vous supprimerez ces champs de votre modèle dans la fonctionnalité ou étirez votre "GroceryList" "classe et utilisez votre nouvelle classe dans la base de données obtiendra une exception:

"L'élément 'IsOwner' ne correspond à aucun champ ou propriété de classe."

Une autre façon (au lieu de modifier votre classe de modèle) consiste à utiliser " Register Class Map " with " SetIgnoreExtraElements" and "UnmapMember" ensemble.

Dans votre cas, ajoutez simplement 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 le mappage de classes Mongo dans:

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

4
Aviram Fireberger

Juste au cas où quelqu'un pourrait être intéressé par une autre façon de le faire. Via les 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 enregistrer cette convention une fois lors du démarrage de votre application:

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