在不将 [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"
}
可以通过应用 [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"
}