我在同一文档中有不同类型的通用对象:一个基础对象和两个具有不同属性的子对象。在db中我只保留子节点,但最重要的是使用只有2个字段并缓存在内存中的基础对象。
但有时我需要得到对象(孩子)的所有信息,而不仅仅是基础。为此,我需要知道子对象的类型(来自基础对象)。
要知道类型,MongoDb使用鉴别器。默认情况下,它是_t
。所以我决定将这个默认鉴别器添加到我的基类:
public string _t { get; private set; }
现在我在_t
属性中看到了孩子的类型。所有工作都可以保存在db对象中,但不能用于新的objcets。
当我试图在db中保存一个新的childern对象时,它试图通过value = null
传递_t属性。但_t
是鉴别器的保留字段,因此我收到错误:Duplicate element name '_t'
。
问题:
如何在db对象模型中保留_t
属性,但仅将此字段映射为读取操作?
解决方案: 问题实际上只出现在新对象中,所以我做了这个:
[BsonIgnoreIfNull]
public string _t { get; private set; }
现在如果_t
为空,映射器将忽略此属性并让mongodb驱动程序创建一个没有任何问题的鉴别器。
答案 0 :(得分:2)
你好像在re-inventing the wheel。使用内置鉴别器(将自动序列化_t
字段)或write your own serializer。
[BsonDiscriminator("Base")]
[BsonKnownTypes(typeof(D1), ...)]
class Base {
}
class D1 : Base {
}
那些将自动序列化 (无需自己添加_t
)
{ "_id" : 1, "_t" : "Base", ... }
和
{ "_id" : 1, "_t" : "D1", ... }
分别
当您向自己的班级添加字段_t
时,您就会“退出”#39;默认序列化程序的保留空间。此外,从OOP的角度来看,存储课程'对象实例中的名称似乎没有多大意义,因此最好避开它。
使用自定义序列化程序,您可以避免为基类的实例编写鉴别器值,但我认为这不值得。