簡體   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