Внедрение для всех классов BsonIgnoreExtraElements

Я использую mongDb с MongoDrive, мне интересно, как я могу реализовать для всех моих классов [BsonIgnoreExtraElements].

Я знаю, что существует способ ConventionProfile, но я не знаю, как его реализовать.

Ответы

Ответ 1

Используйте метод SetIgnoreExtraElementsConvention (из раздела "Соглашения" драйвера С# Учебник по сериализации):

var myConventions = new ConventionProfile();
myConventions.SetIgnoreExtraElementsConvention(new AlwaysIgnoreExtraElementsConvention()));
BsonClassMap.RegisterConventions(myConventions, (type) => true);

Параметр (type) => true является предикатом, зависящим от типа класса, который определяет, следует ли применять соглашение. Таким образом, согласно вашему требованию, он должен просто возвращать истинное значение независимо; но вы можете использовать это, чтобы установить/исключить соглашение по заданным типам, если хотите.

Edit

По словам Evereq, вышесказанное устарело. Теперь используйте:

var conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) };
ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);

Ответ 2

В принципе,

mongoDB предоставляет вам возможность хранить документы в пределах одной коллекции, каждая из которых может иметь свою собственную схему. Это радикальное изменение, если у вас есть фон в реляционных базах данных. В реляционной базе данных у вас есть статическая схема для таблицы, и вы не можете отклоняться от нее, не меняя структуру таблицы. В приведенном ниже примере я определил класс Person и класс PersonWithBirthDate, который происходит из класса Person. Они могут храниться в одной коллекции в базе данных mongoDB. В этом случае предположим, что документы хранятся в коллекции лиц.

См. пример кода -

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class PersonWithBirthDate : Person
{
    public DateTime DateOfBirth { get; set; }
}

Теперь вы можете легко получить и документы, а драйвер mongoDB С# десериализовать документ в класс PersonWithBirthDate. Тем не менее, вы столкнетесь с проблемами при запросе коллекции лиц и попросите их десериализовать данные в класс Person. Вы получите сообщение об ошибке, что есть элементы, которые нельзя десериализовать. Это легко устранить, добавив атрибут [BsonIgnoreExtraElements] в класс Person. Вы можете увидеть измененный класс ниже. Это даст указание водителю игнорировать любые элементы, которые он не может десериализовать в соответствующее свойство. С атрибутом любой документ в коллекции лиц может быть исключен из класса Person без ошибок.

[BsonIgnoreExtraElements]
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class PersonWithBirthDate : Person
{
    public DateTime DateOfBirth { get; set; }
}

Надеюсь, это очистит ваше понимание.