c# - 未知鉴别器值 MongoDB

标签 c# mongodb

我基本上想要一个保存多种类型的对象/文档的集合,但它们都继承自一个基本接口(interface)。但是,我在加载时不断收到此异常:

附加信息:反序列化类 Character 的 Inventory 属性时出错:未知鉴别器值“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 的特殊字段保存到 DB,其中包含鉴别器值。在您的情况下,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/

相关文章:

c# - 如何从 .NET 运行录制的 (HTML) selenium 测试

c# - Lambda表达式-如果不存在则添加到集合

C# 添加事件处理程序文字代码块

c# - 查询 documentdb 中的子字段

javascript - 仅在数据不存在时将数据添加到数据库(Node js)

java - MySQL、MongoDB、RabbitMQ 的事务原子性

c# - 在调试上下文列表中表示内容的更好方法?

c# - 使用匿名类型集合在 WPF 中填充 DataGrid

mongodb - 在Elasticsearch中跨多个索引和引用文档进行搜索

node.js - 一段时间后自动更新 Mongoose 文档(node.js)对象的属性