MongoDb C#只读字段
本文关键字:读字段 MongoDb | 更新日期: 2023-09-27 18:00:53
我在同一文档中有不同类型的泛型对象:一个基本对象和两个具有不同属性的子对象。在数据库中,我只保留子对象,但大多数都使用只有2个字段并缓存在内存中的基本对象。
但有时我需要获得对象(儿童(的所有信息,而不仅仅是基础信息。为此,我需要知道儿童对象的类型(从基本对象(。
为了知道类型,MongoDb使用鉴别器。默认情况下为_t
。因此,我决定将这个默认鉴别器添加到我的基类中:
public string _t { get; private set; }
现在我在_t
属性中看到了子级的类型。对于保存在数据库中的对象,一切都很好,但对于新对象则不然。当我试图在db中保存一个新的childern对象时,它试图用value = null
传递there_t属性。但是_t
是鉴别器的保留字段,所以我得到了错误:Duplicate element name '_t'
。
问题:
如何在数据库对象模型中保留_t
属性,但映射此字段仅用于读取操作?
解决方案:问题实际上只出现在新对象中,所以我做了这个:
[BsonIgnoreIfNull]
public string _t { get; private set; }
现在,如果_t
为空,映射程序将忽略此属性,并让mongodb驱动程序创建一个鉴别器,而不会出现任何问题。
你似乎在重新发明轮子。要么使用内置的鉴别器(它将自动序列化_t
字段(,要么编写自己的序列化程序。
[BsonDiscriminator("Base")]
[BsonKnownTypes(typeof(D1), ...)]
class Base {
}
class D1 : Base {
}
这些将被自动序列化为(无需自己添加_t
(作为
{ "_id" : 1, "_t" : "Base", ... }
和
{ "_id" : 1, "_t" : "D1", ... }
分别。
当您将字段_t
添加到类本身时,您正在"入侵"默认序列化程序的保留空间。此外,从OOP的角度来看,将类名存储在对象实例中似乎没有多大意义,因此最好避开这一点。
使用自定义序列化程序,您可能可以避免为基类的实例编写鉴别器值,但我认为这不值得麻烦。
您可以使用'bool ShouldSerializeXYZ(('或'[IgnoreIfNull]'来阻止字段的序列化,但这可能无法解决映射中字段的重复问题。
也许这就是你想要的:https://stackoverflow.com/a/63686596/1728370此解决方案本质上通过某些类型的策略返回一个"null"鉴别器值。