MongoDB C #: лучший шаблон Сериализации ID - PullRequest
16 голосов
/ 08 октября 2011

У меня есть класс User, и мне нужно работать с ними в веб-службах.

Тогда проблема в том, что если я попытаюсь сериализовать Id, то есть тип BsonObjectId, я вижу, чтоиметь пустое свойство, которое имеет пустое свойство и т. д. ...

Я должен написать этот обходной путь по порядку, это хорошее решение?

public partial class i_User 
{
    [BsonId(IdGenerator = typeof(BsonObjectIdGenerator))]
    [NonSerialized]
    public BsonObjectId _id;

    public String Id
    {
        get
        {
            return this._id.ToString();
        }
    }   
}   

Таким образом,Я могу сохранить _Id как BsonObjectId, но отправляю строковое представление через Интернет в свойстве Id.

Другое решение заключается в работе с StringObjectIdGenerator

public partial class i_User 
{
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    public String id;
}

Но стоит увидеть, что MongoDB будет хранить string в базе данных вместо ObjectId.

Каков наилучший подход для работы в среде сериализации, такой как веб-сервисы и / или клиент-сервер (Flash+ C #)?

Ответы [ 3 ]

95 голосов
/ 02 ноября 2011

Если я вас правильно понимаю, вы хотите получить доступ к свойству Id в виде строки, но сохранить Id как ObjectId в MongoDB.Это можно сделать, используя BsonRepresentation с BsonId.

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }

Подробности можно найти здесь .

7 голосов
/ 23 июня 2014

Если вы хотите сделать это с картой классов - это способ сделать это:

BsonClassMap.RegisterClassMap<i_User>(cm =>
{
  cm.AutoMap();
  cm.SetIdMember(cm.GetMemberMap(x => x.Id)
    .SetIdGenerator(StringObjectIdGenerator.Instance));
});
1 голос
/ 12 августа 2017

Существует также более общий подход, использующий условные обозначения .Этот подход позволяет настроить правила для всех моделей в одном месте.

Сначала.Добавить соглашение для генератора идентификаторов

public class IdGeneratorConvention : ConventionBase, IPostProcessingConvention
{
    public void PostProcess(BsonClassMap classMap)
    {
        var idMemberMap = classMap.IdMemberMap;
        if (idMemberMap == null || idMemberMap.IdGenerator != null)
        {
            return;
        }

        idMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
    }
}

Секунда.Зарегистрируйте нашу конвенцию.Register метод должен вызываться перед первым запросом .

var conventionPack = new ConventionPack { new IdGeneratorConvention() };
ConventionRegistry.Register("Pack", conventionPack, x => true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...