【问题标题】:Should I create the "Id" property when modeling a LINQ cosmos db?建模 LINQ cosmos db 时是否应该创建“Id”属性?
【发布时间】:2020-09-21 12:58:32
【问题描述】:

假设我要创建如下文档

{
    "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

【问题讨论】:

  • Cosmos(或可能是 EF cosmos 驱动程序)创建它自己的“id”字段,这与您通常在 EF 类中找到的“Id”字段无关。我们的数据库有 Idid 字段。
  • @Neil 这不是真的,您可以为id 提供您自己的值。 @Rodrigo,请显示由您的代码创建的项目的完整示例,如模拟器中所示?
  • 这对我的项目@NoahStahl 来说是真的!

标签: c# azure azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

下面是我的测试代码,大家可以试试:

文档.cs

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

汽车.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());

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-12-01
    • 2019-12-10
    相关资源
    最近更新 更多