如何使用C#中的文档数据库客户端从cosmos数据库读取派生对象

时间:2018-12-08 21:36:48

标签: c# azure-cosmosdb

我必须将复杂的对象存储在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,因为它没有被重新建议。

1 个答案:

答案 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部分。