使用 C# 在 MongoDB 中反序列化接口 - 未知的鉴别器值

Deserializing interface in MongoDB using C# - Unknown discriminator value

首先,我使用当前版本的 MongoDB (3.2) 及其 C# 驱动程序 (2.2.3)。 我有以下 类:

public class Item
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    // ... some other properties

    public Data Data { get; set; }
}

public class Data
{
    public string BaseType { get; set; }
    public IBaseData BaseData { get; set; }
}

public interface IBaseData 
{
    string Name { get; set; }
    int Version { get; set; }
    IDictionary<string, object> PayloadData { get; }
}

然后我有一些不同的 IBaseData 接口实现:

public class EventData : IBaseData
{
    public int Version { get; set; }
    public string Name { get; set; }
    public IDictionary<string, object> PayloadData { get; set; }
    public IDictionary<string, object> Properties { get; set; }
}

public class ExceptionData : IBaseData
{
    // Implementation of the interface and some additional properties
}

将 Item-object 存储到 MongoDB 是没有问题的,似乎一切都是正确的。 Mongo 使用 _t 来确定 IBaseData 的类型(例如 EventData)。当我第一次尝试检索数据时,它工作得很好,这意味着我拥有完整的对象树。 当我重新启动应用程序 并再次post 相同的请求时,出现以下错误:

An error occurred while deserializing the Data property of class Domain.Objects.Item: An error occurred while deserializing the BaseData property of class Domain.Objects.Data: Unknown discriminator value 'EventData'.

删除 Mongo 数据库并启动应用程序后,它又按预期运行了。

Google 给了我不同的方法,但没有任何帮助:

Storing a Dictionary with polymorphic values in mongoDB using C#

Unknown discriminator value 'MyEvent'

Deserialize object as an interface with MongoDB C# Driver

我想使用 属性 注释,例如 [BsonKnownTypes(typeof(Type1), typeof(Type2)],但这只适用于 类。

你有什么想法吗?

我通过在 Program.cs(或其他应用程序启动 class)中添加 classmap 部分解决了我的问题:

        BsonClassMap.RegisterClassMap<EventData>(cm =>
        {
            cm.AutoMap();
            cm.SetDiscriminator("EventData");
        });

        BsonClassMap.RegisterClassMap<ExceptionData>(cm =>
        {
            cm.AutoMap();
            cm.SetDiscriminator("ExceptionData");
        });

如果有人找到了使用注释的方法,请回答这个问题。

查看 Setting the Discriminator Value section of MongoDB C# Driver documentation on polymorphism,似乎分别用 [BsonDiscriminator("EventData")][BsonDiscriminator("ExceptionData")] 注释您的 类,应该等同于您的答案中的示例。