Entity framework core 如果项目无法读取,是否可以从Cosmos中删除该项目?

Entity framework core 如果项目无法读取,是否可以从Cosmos中删除该项目?,entity-framework-core,azure-cosmosdb,Entity Framework Core,Azure Cosmosdb,我已经设法使用EF Core在Cosmos中创建了以下项目: { "Code": "https://CokeURL.com/gbm330", "Quantity": 1, "StockItemId": "00000ff8-0000-0000-0000-000000000000", "id": "h

我已经设法使用EF Core在Cosmos中创建了以下项目:

    {
        "Code": "https://CokeURL.com/gbm330",
        "Quantity": 1,
        "StockItemId": "00000ff8-0000-0000-0000-000000000000",
        "id": "https://CokeURL.com/gbm330",
        "_rid": "-BdUAM1W389NAgAAAAAAAA==",
        "_self": "dbs/-BdUAA==/colls/-BdUAM1W388=/docs/-BdUAM1W389NAgAAAAAAAA==/",
        "_etag": "\"1e001ff0-0000-1100-0000-608004300000\"",
        "_attachments": "attachments/",
        "_ts": 1619002416
    }
我需要删除它,但似乎我需要先阅读该项目。我已尝试通过Cosmos data explorer,但单击该行会出现以下错误:

无法读取项目: 在resourceId中不能使用非法字符['/'、'''?'、'#']

我还尝试使用EF Core删除,但这会引发一个异常,看起来它与SQL API相关:

响应状态代码不表示成功:未找到(404);子状态:0;活动ID:7e652a49-9813-4959-b55e-57b228231d6a;原因:(值'dbs/Stock/colls/StockItemCode/docs/https://CokeURL.com/gbm330为查询“$resolveFor”指定的”无效。 ActivityId:7e652a49-9813-4959-b55e-57b228231d6a,Linux/10 cosmos netstandard sdk/3.11.4)

是否有其他方法删除该项目


谢谢

有趣的问题!使用SDK将无法删除文档

然而,有一个解决办法。实际上,Cosmos DB具有设置容器/文档上的
生存时间(TTL)
属性的功能。在文档级别正确设置后,一旦TTL过期,文档将自动删除

但是,在执行此操作之前,需要将容器上的TTL属性设置为“on”(默认值为Off)。此设置的意思是,如果在文档上指定了TTL,并且一旦TTL过期,容器中的文档将自动删除。您可以通过Azure Portal中的Data Explorer进行设置,如下所示

一旦在容器级别正确配置了TTL,接下来需要做的就是更新文档并在文档上设置TTL属性。您可以使用Cosmos DB SDK来实现这一点。请参阅示例代码,其中我将TTL设置为30秒(您可以将其设置为低至1秒)。一旦upsert操作成功,您将看到文档在TTL过期后自动删除(在我的例子中为30秒)

静态异步任务UpdateItemTtl()
{
CosmosClient CosmosClient=新的CosmosClient(连接字符串);
Container Container=cosmosClient.GetContainer(数据库名,containerName);
字符串documentBody=“{\'ttl\':30,\'Code\':\”https://CokeURL.com/gbm330\“,”数量\“:1,\”活动id\“:\”0000\“,\”id\“:\”https://CokeURL.com/gbm330\"}";
对象o=JsonConvert.DeserializeObject(documentBody);
ItemResponse-response=wait container.UpsertItemAsync(o,新分区键(“0000”);
documentBody=JsonConvert.SerializeObject(response.Resource);
Console.WriteLine(文档体);
}

极好的答案!:D工作得很好这真是个有趣的问题!我认为Cosmos API应该更改API,使其不允许“id”有任何值,因为它会对更新/删除文档产生影响。我很高兴听到你的消息,同意。我会和团队一起复习的。@MarkBrown-谢谢!
    static async Task UpdateItemTtl()
    {
        CosmosClient cosmosClient = new CosmosClient(connectionString);
        Container container = cosmosClient.GetContainer(databaseName, containerName);
        string documentBody = "{\"ttl\": 30, \"Code\": \"https://CokeURL.com/gbm330\", \"Quantity\": 1, \"ActivityId\": \"0000\", \"id\": \"https://CokeURL.com/gbm330\"}";
        Object o = JsonConvert.DeserializeObject(documentBody);
        ItemResponse<object> response = await container.UpsertItemAsync(o, new PartitionKey("0000"));
        documentBody = JsonConvert.SerializeObject(response.Resource);
        Console.WriteLine(documentBody);
    }