在不将 [BsonDiscriminator(Required = true)] 属性应用于每个 class 的情况下,始终使用鉴别器保存类型

Have types always get saved with a discriminator without applying [BsonDiscriminator(Required = true)] attribute to each class

可以通过应用 [BsonDiscriminator(Required = true)] 属性强制 MongoDB.Driver 保存特定类型的鉴别器。

例如:

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

导致这个json:

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

现在我的问题是:
是否可以将 MongoDB.Driver 配置为始终为每种类型保存鉴别器,而无需在每个 class 上显式应用 [BsonDiscriminator(Required = true)] 属性?

编辑:
一种可能性是从具有 [BsonDiscriminator(Required = true)] 属性集的基础 class 派生所有实体。但我宁愿不这样做,以避免让我的实体对所使用的持久性机制了解太多。

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

首先我们创建一个 ConventionPack 并向其中添加我们的 ClassMapConvention

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

创建 ConventionPack 之后,我们只需像这样将其注册到 ConventionRegistry

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

备注
必须在调用 MongoDB Api.

之前注册约定

现在保存到数据库中的每个对象都保存了一个额外的类型 _t 属性(无需在 [= 上显式添加 [BsonDiscriminator(Required = true)] 属性37=]级):

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