[英]MongoDb C# readonly field
我在同一文档中有不同类型的通用对象:一个基础对象和两个具有不同属性的子对象。 在数据库中,我仅保留子项,但大多数都使用仅具有2个字段并缓存在内存中的基础对象。
但是有时我需要获取对象(子对象)的所有信息,而不仅仅是基础信息。 为此,我需要知道子对象的类型(从基础对象)。
要知道类型,MongoDb使用区分符。 默认情况下为_t
。 因此,我决定将此默认标识符添加到我的基类中:
public string _t { get; private set; }
现在,我在_t
属性中看到了子类型。 一切都适用于保存在db对象中,但不适用于新的objcets。 当我尝试在db中保存新的子对象时,它试图将_t属性传递给value = null
。 但是_t
是区分_t
的保留字段,因此出现错误: Duplicate element name '_t'
。
问题:
如何在数据库对象模型中保留_t
属性,但仅将此字段映射为读取操作?
解决方案:问题实际上仅存在于新对象中,所以我这样做了:
[BsonIgnoreIfNull]
public string _t { get; private set; }
现在,如果_t
为空,则映射器将忽略此属性,并让mongodb驱动程序毫无问题地创建鉴别器。
您似乎在这里重新发明了轮子 。 请使用内置的鉴别_t
(它将自动序列化_t
字段),或者编写自己的序列化程序 。
[BsonDiscriminator("Base")]
[BsonKnownTypes(typeof(D1), ...)]
class Base {
}
class D1 : Base {
}
这些将被自动序列化(无需自己添加_t
)为
{ "_id" : 1, "_t" : "Base", ... }
和
{ "_id" : 1, "_t" : "D1", ... }
分别。
当您向类本身添加字段_t
,就是在“入侵”默认序列化程序的保留空间。 同样,从OOP的角度来看,将类的名称存储在对象实例中似乎没有多大意义,因此最好避免这种情况。
使用自定义序列化程序,您可以避免编写基类实例的鉴别值,但是我认为这样做不值得。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.