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

时间:2016-05-18 10:00:59

标签: c# mongodb mongodb-.net-driver

首先,我使用当前版本的MongoDB(3.2)及其C#-driver(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)。当我第一次尝试检索数据时,它完美地工作,这意味着我拥有完整的对象树。 当我重新启动应用程序并再次发布相同的请求时,我收到以下错误:

  

反序列化Domain.Objects.Item类的Data属性时发生错误:反序列化Domain.Objects.Data类的BaseData属性时发生错误:未知的判别器值'EventData'。

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

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

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)]这样的属性注释,但这只适用于类。

你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我通过在Program.cs(或其他应用程序启动类)中添加一个类映射来部分地解决了这个问题:

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

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

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

答案 1 :(得分:0)

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