Подтвердить что ты не робот

Драйвер MongoDB С#: игнорировать свойство вставить

Я использую официальный MongoDB С# 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 на уровне приложения, а затем возвращаю его обратно в контроллер, который сопоставляет объект с моделью просмотра.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

На всякий случай кто-то может быть заинтересован в другом способе этого. Через условные обозначения:

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

Ответ 5

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

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

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

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

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

Вы можете узнать больше о Mapo Class Mapping в:

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