Моя объектная модель:
public class PhoneBook
{
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
мое создание контейнера:
db.CreateContainerIfNotExistsAsync("phoneBooks", "/id")
моя команда вставки:
PhoneBook pb = new() { Id = Guid.NewGuid().ToString(), Name = "hello world };
db.GetContainer("phoneBooks").CreateItemAsync(pb, new PartitionKey(pb.Id));
есть идеи, где я ошибаюсь?
Я также попробовал использовать «/Id» в качестве ключа раздела, потому что решил, что он должен быть чувствителен к регистру. Однако никакой радости. Используя проводник данных, я могу легко добавлять контент, даже если назову свойство «id», а ключ раздела — «/Id». Это элемент, который я добавил вручную
{ "id": "4faebd8b-717a-4692-ae00-74aa209d706f", "name": "привет, мир" }
Код состояния ответа не указывает на успех: BadRequest (400); Подстатус: 0
Спасибо за ваше предложение, Дэвид. Он работает хорошо, и данные были успешно вставлены в контейнер Azure Cosmos DB путем упоминания [JsonProperty("id")]
в свойстве Id, как вы можете видеть в приведенном ниже коде.
public class PhoneBook
{
[JsonProperty("id")]
public string Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public CosmosDbService(string endpointUri, string primaryKey, string databaseId, string containerId)
{
CosmosClientOptions clientOptions = new CosmosClientOptions
{
ConnectionMode = ConnectionMode.Direct,
MaxRetryAttemptsOnRateLimitedRequests = 5,
MaxRetryWaitTimeOnRateLimitedRequests = TimeSpan.FromSeconds(30)
};
_cosmosClient = new CosmosClient(endpointUri, primaryKey, clientOptions);
_database = _cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId).GetAwaiter().GetResult().Database;
_container = _database.CreateContainerIfNotExistsAsync(containerId, "/id").GetAwaiter().GetResult().Container;
}
public static async Task Main(string[] args)
{
string endpointUri = "*****";
string primaryKey = "*****";
string databaseId = "db1";
string containerId = "phoneBooks";
CosmosDbService cosmosDbService = new CosmosDbService(endpointUri, primaryKey, databaseId, containerId);
PhoneBook pb = new PhoneBook
{
Id = Guid.NewGuid().ToString(),
Name = "hello world",
Description = "Sample description"
};
await cosmosDbService.CreatePhoneBookItemAsync(pb);
}
Выход:
{
"id": "69daea1c-fd73-4c27-89b0-50428f27ef89",
"Name": "hello world",
"Description": "Sample description"
}
Забавно то, что вы можете добавить документ с идентификатором, а не с идентификатором, используя проводник данных. Результирующий документ будет иметь свойства Id и id. И в ошибке не было никакой информации об отсутствующем свойстве id - по моему мнению, это было бы здесь полезно.
Еще один способ решить эту проблему — установить PropertyNamingPolicy
из CosmosClientOptions.SerializerOptions
на CosmosPropertyNamingPolicy.CamelCase
.
Попробуйте добавить
[JsonProperty("id")]
к своему свойствуId
(в каждом документе естьid
, а неId
).