代码之家  ›  专栏  ›  技术社区  ›  croxy StartPlayer

使类型始终与鉴别器一起保存,而不向每个类应用[bsondiscriminator(required=true)]属性

  •  2
  • croxy StartPlayer  · 技术社区  · 6 年前

    可以通过应用 [BsonDiscriminator(Required = true)] 属性。

    例如:

    [BsonDiscriminator(Required = true)]
    public class MyClass
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id { get; set; }
    }
    

    导致此json:

    {
        "_id" : ObjectId("5b3caf1bed2891065c972547"),
        "_t" : "MyClass"
    }
    

    现在我的问题是:
    是否可以将mongodb.driver配置为始终保存每种类型的鉴别器,而不显式应用 [bSondiscriminator(必需=真)] 每个类的属性?

    编辑:
    一种可能是从具有 [bSondiscriminator(必需=真)] 属性集。但我宁愿不这样做,以免我的实体对所使用的持久性机制了解得太多。

    1 回复  |  直到 6 年前
        1
  •  1
  •   croxy StartPlayer    6 年前

    我想出的解决方案是创建和注册一个自定义 ClassMapConvention ( MongoDB Conventions )中。

    首先我们要创造一个 ConventionPack 添加我们的 类映射约定 致:

    var pack = new ConventionPack();
    pack.AddClassMapConvention("AlwaysApplyDiscriminator", m => m.SetDiscriminatorIsRequired(true));
    

    在创建 会议包 我们只需要把它注册到 ConventionRegistry 这样地:

    ConventionRegistry.Register("CustomConventions", pack, t => true);
    

    笔记
    必须在调用MongoDB API之前注册该约定。


    现在,保存到数据库中的每个对象都用一个附加类型保存 _ T型 属性(无需显式添加 [BsonDiscriminator(Required = true)] 类级别的属性):

    {
        "_id" : ObjectId("5b3caf1bed2891065c972547"),
        "_t" : "MyClass"
    }