Ответ 1
Похоже, что атрибут [BsonIgnore] выполнил эту работу.
public class GroceryList : MongoEntity<ObjectId>
{
public FacebookList Owner { get; set; }
[BsonIgnore]
public bool IsOwner { get; set; }
}
Я использую официальный 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 на уровне приложения, а затем возвращаю его обратно в контроллер, который сопоставляет объект с моделью просмотра.
Надеюсь, мой вопрос имеет смысл. спасибо!
Похоже, что атрибут [BsonIgnore] выполнил эту работу.
public class GroceryList : MongoEntity<ObjectId>
{
public FacebookList Owner { get; set; }
[BsonIgnore]
public bool IsOwner { get; set; }
}
Также вы можете сделать IsOwner Nullable и добавить [BsonIgnoreExtraElements] в класс дыр:
[BsonIgnoreExtraElements]
public class GroceryList : MongoEntity<ObjectId>
{
public FacebookList Owner { get; set; }
public bool? IsOwner { get; set; }
}
Свойство с нулевым значением будет игнорироваться во время поиска. Но я думаю, что [BsonIgnore] будет лучше для вашего дела.
В качестве альтернативы, если вы не хотите использовать атрибут по какой-либо причине (например, если вы не хотите использовать дополнительную зависимость от MongoDB.Bson
для своего DTO), вы можете сделать следующее:
BsonClassMap.RegisterClassMap<GroceryList>(cm =>
{
cm.AutoMap();
cm.UnmapMember(m => m.IsOwner);
});
На всякий случай кто-то может быть заинтересован в другом способе этого. Через условные обозначения:
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);
Вероятно, вам нужно объединить два атрибута 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/