首先,我使用当前版本的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)]
这样的属性注释,但这只适用于类。
你有什么想法吗?
答案 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")]
注释您的课程应该等同于您答案中的示例。