2013-10-27 6 views
1

Я использую клиент mongo .net и использую функции коллекции для объектов. проблема я столкнулся в эволюции схемыОшибка развития схемы схемы Mongo .net

Когда я переименовал поле в своем классе, например, измените имя поля с комментария на комментарии, и я сделаю это изменение в своем классе, я получаю исключение из Mongo, когда я выполняю выборку.

Мое предположение, что клиент mongo будет игнорировать поля, которые существуют в коллекции, но не существует в моем классе .net.

будет счастлив, если это возможно, без трансформации между bson и .net классом.

ответ

2

Если вы хотите продолжать использовать старое имя, которое вы могли бы использовать BsonElement атрибут:

class Demo { 
    [BsonElement("Comment")] 
    public string Comments { get; set; } 
} 

Используя этот синтаксис будет указать драйвер MongoDB C#, чтобы найти данные для Comments свойства/полей в поле в документе в поле с именем Comment. Это означало бы, что вам не нужно беспокоиться о перемещении/копировании данных из старого местоположения. Он часто используется для использования более длинных дружественных имен в исходном коде при минимизации фактического размера документа BSON (поскольку полное имя свойства всегда сохраняется в документе в коллекции базы данных). При сокращении, вы могли бы, например, просто использовать:

[BsonElement("c")] 
public string Comments { get; set; } 

Некоторые из драйверов MongoDB не имеют этой функции (и я желаю, чтобы они сделали!).

Во-вторых, вы также можете просто добавить специальный атрибут к классу игнорировать все неизвестные элементы класса и не бросил исключение:

[BsonIgnoreExtraElements] 
public Demo { 
    public string Comments { get; set; } 
} 

Тогда, если поле с именем Comment найден, но не может» t будет соответствовать свойству вашего класса C#, он будет проигнорирован. Я часто использую это во время разработки, поскольку изменяется схема, но затем удаляю ее позже, чтобы я мог поймать неожиданные поля.

Или вы можете также использовать BsonClassMap, чтобы сделать подобные изменения:

BsonClassMap.RegisterClassMap<Demo>(cm => { 
    cm.AutoMap(); 
    cm.SetIgnoreExtraElements(true); 
}); 

Есть даже еще несколько вариантов документированных here если вы хотите полный контроль.

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