Драйвер MongoDB C #: игнорировать свойство при вставке - PullRequest
33 голосов
/ 04 февраля 2011

Я использую официальный MongoDB C # Drive v0.9.1.26831, но мне было интересно, учитывая класс POCO, есть ли способ игнорировать вставку определенных свойств.

Например, у меня есть следующий класс:

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

Есть ли способ, чтобы IsOwner не вставлялся, когда я вставляю объект GroceryList? По сути, я выбираю объект из базы данных, затем устанавливаю свойство IsOwner на уровне приложения и затем возвращаю его обратно в контроллер, который затем сопоставляет объект с моделью представления.

Надеюсь, мой вопрос имеет смысл. спасибо!

Ответы [ 5 ]

52 голосов
/ 04 февраля 2011

Похоже, что атрибут [BsonIgnore] выполнил задание.

public class GroceryList : MongoEntity<ObjectId>
{
    public FacebookList Owner { get; set; }
    [BsonIgnore]
    public bool IsOwner { get; set; }
}
14 голосов
/ 04 февраля 2011

Также вы можете сделать IsOwner Nullable и добавить [BsonIgnoreExtraElements] к классу отверстия:

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

Свойство со значением NULL будет игнорироваться при поиске.Но я думаю, что [BsonIgnore] будет лучше для вашего случая.

11 голосов
/ 23 марта 2016

В качестве альтернативы, если вы не хотите использовать атрибут по какой-либо причине (например, если вы не хотите вносить дополнительную зависимость в MongoDB.Bson вашего DTO), вы можете сделать следующее:

BsonClassMap.RegisterClassMap<GroceryList>(cm =>
{
  cm.AutoMap();
  cm.UnmapMember(m => m.IsOwner);
});
4 голосов
/ 29 июня 2017

Возможно, вы захотите объединить два атрибута BsonIgnoreExtraElements и BsonIgnore .Причина этого заключается в том, что BsonIgnore не будет вставлять свойство «IsOwner» в вашу БД, но если у вас есть «старые» экземпляры в вашей БД, которые содержали это поле, и вы удалите эти поля из своей модели в компоненте или расширите свой «GroceryList»"class и используйте ваш новый класс в БД, получите исключение:

" Элемент 'IsOwner' не соответствует ни одному полю или свойству класса. "

Другойспособ (вместо редактирования вашего модельного класса) состоит в использовании " Регистрация карты классов " с " SetIgnoreExtraElements" и "UnmapMember" вместе.

В вашем случае просто добавьтеэтот код при инициализации драйвера:

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

Подробнее о сопоставлении классов Mongo можно прочитать в:

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

3 голосов
/ 01 марта 2017

На всякий случай, если кого-то заинтересует другой способ сделать это.С помощью соглашений:

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

И затем вам необходимо зарегистрировать это соглашение один раз при запуске приложения:

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