未知的鉴别器值MongoDB

时间:2017-04-09 21:17:46

标签: c# 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
{
...
}

非常感谢帮助。

1 个答案:

答案 0 :(得分:9)

问题是您没有向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

为什么:表示多态类型的文档(例如接口)使用名为_t的特殊字段保存到DB,该字段包含鉴别器值。在您的情况下,Character文档将如下所示:

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

在写入时,如果映射不存在,则会动态创建它们,TestItem鉴别符将映射到TestItem类。从那一刻起,映射存在于AppDomain的生命中。因此,例如,如果您在写入后执行读取,则可以。

但是如果你首先读取数据,BSON序列化器不知道TestItem鉴别器映射到什么类型。因此,总是明确指定鉴别器映射是一种好习惯。通过这种方式,您还可以控制鉴别器值 - 默认情况下,它们等于类型名称。