在对LINQ cosmos db建模时是否应该创建“ Id”属性?

问题描述

假设我要创建以下文档

{
    "Id": "6a23a5f3-0f77-40a9-b9f9-26e88537a962","CarHistory": [
        { "model":"ford","price": 100,"kilometers": 100  "current": true },{ "model":"ford","price": 200,"kilometers": 200,"current": false },]
}

在Poco中,我认为该模型在以下几行中可能会有所显示

public class Document
{
    public Guid Id { get; set; }
}

public class Car : Document
{
    public string Model {get; set;}
    public decimal Price {get; set;}
    public int Kilometers {get; set;}
    public bool Current {get; set;}
}

所以以后我创建..

public class MasterCar : Document
{
    public ICollection<Car> CarHistory { get; set; } = new List<Car>();
}

在调试时,一切似乎工作正常: 我以编程方式在以下服务中的某个位置创建了Guid:

var masterCar = new MasterCar(){ Id = Guid.NewGuid() }

但是当我转到cosmos db仿真器和SELECT * FROM时,我签出了Id属性,其值为:

"id": "00000000-0000-0000-0000-000000000000",

有人可以指出我做错了什么吗?或应该如何实现,我读到 您不应该自己提供一个ID,但是那我该如何以编程方式访问Id属性呢? 例如:

CarService.GetById(Car.Id); //Id property doesnt exist if there is no property in poco

解决方法

下面是我的测试代码,您可以尝试:

Document.cs

public class Document
{
    [JsonProperty("id")]
    public Guid Id { get; set; }
}

Car.cs

public class Car
{
    [JsonProperty("model")]
    public string Model { get; set; }

    [JsonProperty("price")]
    public decimal Price { get; set; }
    [JsonProperty("kilometers")]
    public int Kilometers { get; set; }
    [JsonProperty("current")]
    public bool Current { get; set; }

    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}

MasterCar.cs

public class MasterCar : Document
{
    public ICollection<Car> CarHistory { get; set; } = new List<Car>();

    public override string ToString()
    {
        return JsonConvert.SerializeObject(this);
    }
}

创建和搜索:

        var guid = Guid.NewGuid();
        var masterCar = new MasterCar() { Id = guid };
        var car = new Car() { Model = "ford",Price = 100,Kilometers = 100,Current = true };
        var car2 = new Car() { Model = "ford",Price = 200,Kilometers = 200,Current = false };
        var carHistory = masterCar.CarHistory;
        carHistory.Add(car);
        carHistory.Add(car2);

        CosmosClient client = new CosmosClient(connection_string);
        Container container = client.GetContainer(databaseId,containerName);
        await container.CreateItemAsync<MasterCar>(masterCar);

        ItemResponse<MasterCar> itemResponse =  await container.ReadItemAsync<MasterCar>(guid.ToString("D"),new PartitionKey(guid.ToString("D")));
        Console.WriteLine(itemResponse.Resource.ToString());

结果:

enter image description here

enter image description here