我必须将复杂的对象存储在db中,我创建了一个基类Vehicle以及两个派生类Car和Truck,它们继承了Vehicle类。当我存储iam时,我能够正确存储汽车或卡车信息,但是当iam检索数据时,我只能获取Vehicle信息,因为cosmos db没有存储任何类型信息,并且iam使用数据类型作为Vehicle来检索。在反序列化时,cosmos db中是否有任何方法可以根据对象的属性获取派生对象。或建议我采用其他方法将复杂对象存储在cosmosdb中。
public class Vehicle
{
public string Id { get; set; }
}
public class Car : Vehicle
{
public string CarProperty { get; set; }
}
public class Truck : Vehicle
{
public string TruckProperty { get; set; }
}
document1:
{
"id": "8e0fc57e-1886-f7bc-284c-1385a263bdfa",
"Vehicle": {
"Id ": "12314",
"CarProperty ": "b3268e04-e201-4dcf-a159-af28d5b62d4f"
}
document 2:
{
"id": "1886-f7bc-284c-1385a263bdfa-s4ws45",
"Vehicle": {
"Id": "5f37ca24-210e-43d6-b27d-d6710d70ddd3",
"TruckProperty": "e6b47210-f021-43ff-8c44-a8f09036d516"
}
我不想将JsonSerializerSettings用于TypeHandling,因为它没有被重新建议。
答案 0 :(得分:-1)
您需要在基类模型上为映射器提供一些帮助,例如:
[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(Car), typeof(Truck))]
public class Vehicle
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
}
或类似这样的代码:
BsonClassMap.RegisterClassMap<Vehicle>(cm => {
cm.AutoMap();
cm.SetIsRootClass(true);
cm.MapIdMember(c => c.Id);
});
BsonClassMap.RegisterClassMap<Car>();
BsonClassMap.RegisterClassMap<Truck>();
然后您的文档应如下所示:
{
"id": "8e0fc57e-1886-f7bc-284c-1385a263bdfa",
"Vehicle": {
"_id": "5f37ca24-210e-43d6-b27d-d6710d70ddd3",
"_t": "Car",
"CarProperty": "Value for Car Property"
}
生成的“ _t”字段是区分符,用于标识存储了哪种派生的Vehicle类型。
我会查看驱动程序参考的Polymorphism部分。