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 + С#)?
Ответы
Ответ 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);