2017-04-09 23 views
0

我基本上要集合,它節省了多種類型的對象/文件,但所有的人都從一個基接口繼承。不過,我不斷收到此異常時加載:未知鑑別值的MongoDB

Additional information: An error occurred while deserializing the Inventory property of class Character: Unknown discriminator value 'TestItem'.

這是我的代碼:

public class Character 
{ 
    ... 
    public List<IInventoryItem> Inventory { get; set; } 
    ... 
} 

public interface IInventoryItem 
{ 
... 
} 

class TestItem : IInventoryItem 
{ 
... 
} 

非常感謝您的幫助。

回答

2

問題是你沒有明確地向MongoDB驅動程序聲明你的多態類型。

爲此,您有兩個選擇:使用屬性或映射配置方法。這裏更多的信息:http://mongodb.github.io/mongo-csharp-driver/2.2/reference/bson/mapping/

使用屬性:

[BsonDiscriminator("TestItem")] 
public class TestItem : IInventoryItem 
{ 
    ... 
} 

使用映射配置方法:

BsonClassMap.RegisterClassMap<TestItem>(); // do it before you access DB 

WHY:代表態的類型(如接口)的文件被保存到數據庫具有特殊字段名爲_t,其中包含鑑別器值。在你的情況下,Character文件看起來就像這樣:

{ 
    // ... other fields 
    Inventory: [ 
     { 
      _t: "TestItem", 
      //... other fields 
     }, 
     { 
      _t: "TestItem", 
      //... other fields 
     } 
    ] 
    // ... other fields 
} 

在寫入時,如果不存在映射,它們是動態創建和TestItem鑑別被映射到TestItem類。從那一刻起,映射就存在於AppDomain的生命中。因此,例如,如果您在寫入後執行讀取操作,則將會正常。

但是,如果您讀取數據的第一件事情,BSON串行器不知道TestItem鑑別器映射到的是什麼類型。因此總是明確指定鑑別器映射是一種好的做法。通過這種方式,您還可以控制鑑別器值 - 默認情況下它們等於類型名稱。

+0

非常感謝您的幫助,但由於某種原因我仍然收到同樣的錯誤。 – Ahmad45123

+0

其實第二種方法工作..任何理由爲什麼該屬性沒有..我寧願使用它。 – Ahmad45123

+0

您使用的是什麼版本的MongoDB C#驅動程序? –