我基本上想要一个可以保存多种类型的对象/文档的集合,但是它们都从基本接口(interface)继承。但是,在加载时,我总是收到此异常:
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
{
...
}

非常感谢您的帮助。

最佳答案

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

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

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

在写入时,如果不存在映射,则它们将在运行时创建,并且TestItem鉴别符将映射到TestItem类。从那时起,映射就存在了AppDomain。因此,例如,如果在写入后执行读取,则可以。

但是,如果您首先读取数据,则BSON序列化程序将不知道TestItem鉴别符映射到什么类型。因此,始终明确指定区分符映射是一个好习惯。这样,您还可以控制鉴别符值-默认情况下,它们等于类型名。

关于c# - 未知鉴别符值MongoDB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43312039/

10-13 09:08