繁体   English   中英

MongoDb C#只读字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM