Как заставить Update.Set соблюдать мои опции сериализации DateTime? - PullRequest
2 голосов
/ 08 марта 2011

Я использую официальный драйвер 10gen C # для mongoDB.У меня есть некоторый код, который устанавливает сопоставления BSON, он запускается один раз при запуске приложения:

BsonClassMap.RegisterClassMap<Review>(cm =>
{
    cm.AutoMap();
    cm.MapProperty(c => c.Date)
        .SetSerializationOptions(new DateTimeSerializationOptions{DateOnly = true});
    cm.UnmapProperty(c => c.Author);
});

Это прекрасно работает, когда Review является встроенным документом и сохраняется вместе с его родителем.Однако сейчас я пытаюсь обновить конкретный обзор, и он включает в себя некоторое ручное кодирование, например так (волшебные строки, тьфу):

collection.Update(query,
    Update.Set("Reviews.$.Date", review.Date)
    .Set("Reviews.$.Rating", review.Rating)
    .Set("Reviews.$.Title", review.Title)
    .Set("Reviews.$.Comment", review.Comment)
);

Это также работает ... Но это не учитывает настройки сериализации дляDateTime в классе Review и, по-видимому, также сохраняет временную часть (даже если это будет полночь, начиная с review.Date == DateTime.Today).Затем, когда я пытаюсь получить этот документ, я получаю исключение: [FileFormatException: TimeOfDay component for DateOnly DateTime value is not zero].

Как мне это исправить?

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Ничего себе.Это сложный вопрос.Я должен подумать, как лучше всего это решить.Ответ Брайана верен: опции сериализации используются только при сериализации всего класса.Но его последнее предложение вызвать RegisterClassMap для DateTime неверно.

Но я могу предложить вам обходной путь.Причина, по которой вы получаете исключение, заключается в том, что используемый вами DateTime может быть полночью в вашем местном часовом поясе, но он преобразуется в UTC для хранения в базе данных.Вот откуда приходит ненулевой компонент времени.

Вы можете подавить преобразование в UTC, используя:

.Set ("Reviews. $. Date", DateTime.SpecifyKind (review.Date, DateTimeKind.Utc))

Это должно сработать, но дайте мне знать, если это не так, и я проведу дальнейшее расследование.

0 голосов
/ 09 марта 2011

Мне кажется, что сериализатор работает так, что он использует только ваши отображения при сериализации всего класса. Вы не сериализуете класс Review, а вместо этого сериализуете свойство Date класса Review.

Возможно, вам следует попытаться зарегистрировать сопоставление для класса DateTime:

BsonClassMap.RegisterClassMap<DateTime>(...);

Не знаю, сработает ли это, потому что у меня еще не было возможности проверить его, но попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...