MongoDb C#readonly字段

时间:2014-04-30 14:22:35

标签: c# mongodb

我在同一文档中有不同类型的通用对象:一个基础对象和两个具有不同属性的子对象。在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驱动程序创建一个没有任何问题的鉴别器。

1 个答案:

答案 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的角度来看,存储课程'对象实例中的名称似乎没有多大意义,因此最好避开它。

使用自定义序列化程序,您可以避免为基类的实例编写鉴别器值,但我认为这不值得。