设置 MongoDb 以将 属性 更改为大写

Setting MongoDb to change a property to UpperCase

我有以下 poco(为简单起见省略了其他属性):

public class Address
{
   . . .    
  public string CountryCode { get; set; }
   . . .
} 

我必须在 BsonClassMap 中做什么才能为此 属性 强制使用大写。 例如“us”将作为“US”存储在数据库中

BsonClassMap.RegisterClassMap<Address>(cm =>
            {
               // what am I missing here ?
            });

还是我处理方法不对?

检查这个:

  1. SetElementName方式:

    BsonClassMap.RegisterClassMap<Address>(cm =>
    {
        cm.MapField(e => e.CountryCode).SetElementName("COUNTRY_CODE");
    });
    var address = new Address();
    var bson = address.ToBsonDocument();  
    // bson: { "COUNTRY_CODE" : null }
    
  2. BsonElement属性方式:

    public class Address
    {
        [BsonElement("COUNTRY_CODE")]
        public string CountryCode { get; set; }
    } 
    

这是一个自定义序列化程序属性,您可以使用以下内容修饰国家/地区代码 属性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class UpperCaseAttribute : BsonSerializerAttribute
{
    public UpperCaseAttribute() : base(typeof(UpperCaseSerializer)) { }

    private class UpperCaseSerializer : SerializerBase<string>
    {
        public override void Serialize(BsonSerializationContext ctx, BsonSerializationArgs args, string value)
        {
            if (value is null)
                ctx.Writer.WriteNull();
            else
                ctx.Writer.WriteString(value.ToUpper());
        }

        public override string Deserialize(BsonDeserializationContext ctx, BsonDeserializationArgs args)
        {
            switch (ctx.Reader.CurrentBsonType)
            {
                case BsonType.String:
                    return ctx.Reader.ReadString();

                case BsonType.Null:
                    ctx.Reader.ReadNull();
                    return null;

                default:
                    throw new BsonSerializationException($"'{ctx.Reader.CurrentBsonType}' values are not valid on properties decorated with an [UpperCase] attribute!");
            }
        }
    }

用法:

public class Address
{
  [UpperCase]  
  public string CountryCode { get; set; }
}