2011-02-03 3 views
24

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

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

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

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

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

+0

ли вы решить вашу проблему? –

+0

Да, я использовал атрибут BsonIgnore в свойстве IsOwner и решил эту проблему. благодаря! – Abe

ответ

35

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

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

приятно, спасли мой день, спасибо. –

13

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

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

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

+0

, если я использую оба [BsonIgnoreExtraElements] и [BsonIgnore], тогда все свойства, имеющие аннотацию [BsonIgnore], не будут игнорироваться независимо от значений, а остальные, имеющие нулевые значения, также будут игнорироваться. Верный? – WSK

+0

@WSK [BsonIgnoreExtraElements] игнорировать поля из db, которые не находятся в вашем классе при загрузке документа. BsonIgnore игнорирует поле при загрузке/сохранении документа. –

4

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

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

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

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

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

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

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

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

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

Вы можете прочитать больше о Монго Class Mapping в:

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

Смежные вопросы