Подтвердить что ты не робот

MongoDB С#: идентификатор Сериализация лучший образец

У меня есть класс 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 + С#)?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Если вы хотите сделать это с помощью карты классов - вот как это сделать:

BsonClassMap.RegisterClassMap<i_User>(cm =>
{
  cm.AutoMap();
  cm.SetIdMember(cm.GetMemberMap(x => x.Id)
    .SetIdGenerator(StringObjectIdGenerator.Instance));
});

Ответ 3

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

Во-первых. Добавить соглашение для генератора ID

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