我有一个名为Entity
的类,它有Id
属性,类型为Guid
。现在默认情况下,MongoDb将其序列化为二进制,这不是我想要的。
我无法为我的生活获取Id属性序列化为string
。
我尝试了ConventionPack
和ClassMap
。
实体定义:
public class Entity : Dictionary<string, object>
{
public Guid Id
{
get { return this.ContainsKey(nameof(Id)) ? Guid.Parse(this[nameof(Id)].ToString()) : Guid.Empty; }
set { this[nameof(Id)] = value; }
}
public string EntityName
{
get { return this.ContainsKey(nameof(EntityName)) ? this[nameof(EntityName)].ToString() : ""; }
set { this[nameof(EntityName)] = value; }
}
}
班级地图定义:
public class EntityClassMap: BsonClassMap<Entity>
{
public EntityClassMap()
{
AutoMap();
GetMemberMap(x => x.Id).SetSerializer(new GuidSerializer(BsonType.String));
}
}
班级地图注册:
BsonClassMap.RegisterClassMap(new EntityClassMap());
公约
public class GuidAsStringRepresentationConvention : ConventionBase, IMemberMapConvention
{
public void Apply (BsonMemberMap memberMap)
{
if (memberMap.MemberType == typeof(Guid))
{
memberMap.SetSerializer(new GuidSerializer(BsonType.String));
}
}
}
Convention Pack定义和注册:
var pack = new ConventionPack() {new GuidAsStringRepresentationConvention()};
ConventionRegistry.Register("GuidAsString", pack, it => true);
完全不知道我做错了什么。
答案 0 :(得分:0)
好的,显然没有类映射或约定代码错误,问题是Entity
对象继承自Dictionary<string, object>
当我停止继承Dictionary<string, object>
时,一切都开始有效了。
我试图实现的目的基本上是允许保存静态定义的属性和任何额外的属性。
事实证明,Mongo会自动将所谓的“额外元素”映射到实现BsonDocument
或IDictionary<string, object>
的属性,如果它使用被称为ExtraElements的约定或者在映射中配置{ {1}}
它还整理了我的实体类,现在可以使用自动属性:
MapExtraElementsMember(c => c.Fields);
希望这对某人有所帮助,因为我花了大约一天半时间来解决这个问题!