Должен ли я создавать свойство «Id» при моделировании LINQ cosmos db?

#c# #azure #azure-cosmosdb #azure-cosmosdb-sqlapi

#c# #azure #azure-cosmosdb #azure-cosmosdb-sqlapi

Вопрос:

Предположим, что я хочу создать следующий документ

 {
    "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 и a SELECT * FROM , и я проверяю свойство Id, его значение равно:

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

Может кто-нибудь указать мне, что я делаю неправильно? или как это должно быть выполнено, я читал, что
вы не должны сами указывать идентификатор, НО как я могу получить доступ к свойству Id программно?
Например:

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

Комментарии:

1. Cosmos (или, возможно, драйвер EF cosmos) создает собственное поле «id», которое не имеет ничего общего с полем «Id», которое вы обычно находите в классах EF. В нашей базе данных есть оба Id id поля и .

2. @Neil Это неправда, вы можете указать свое собственное значение для id . @Rodrigo, пожалуйста, покажите полный пример элемента, который создается вашим кодом, как показано в эмуляторе?

3. Это верно для моего проекта @NoahStahl !

Ответ №1:

Ниже приведен мой тестовый код, вы можете попробовать:

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());
  

Результат:

введите описание изображения здесь

введите описание изображения здесь