首页 > 解决方案 > Database.ReadAsync() 有什么用?

问题描述

Cosmos DB SQL API 的示例中, Database.ReadAsync()有几个用法,它们似乎没有做任何有用的事情。该方法文档中的第二条注释并没有真正表明它可能用于什么。

在这些情况下使用它的原因是什么?您通常什么时候使用它?

ChangeFeed/Program.cs#L475显示获取数据库然后调用 ReadAsync 以获取对数据库的另一个引用

            database = await client.GetDatabase(databaseId).ReadAsync();
            await database.DeleteAsync();

这似乎在功能上与

            database = client.GetDatabase(databaseId);
            await database.DeleteAsync();

如果找不到数据库,则抛出相同的异常。

DatabaseManagement/Program.cs#L80-L83

        DatabaseResponse readResponse = await database.ReadAsync();
        Console.WriteLine($"\n3. Read a database: {readResponse.Resource.Id}");

        await readResponse.Database.CreateContainerAsync("testContainer", "/pk");

这似乎相当于:

        Console.WriteLine($"\n3. Read a database: {database.Id}");

        await database.CreateContainerAsync("testContainer", "/pk");

产生与以前相同的输出并创建容器。

标签: azure-cosmosdbazure-cosmosdb-sqlapi

解决方案


您是正确的,这些样品可能需要抛光,主要区别是:

  • GetDatabase 只是获取一个代理对象,并不代表数据库确实存在。如果您尝试对不存在的数据库(例如 CreateContainer)执行操作,它可能会失败并返回 404。
  • ReadAsync 将读取DatabaseProperties并允许您从那里获取任何信息,并且如果数据库实际存在,也会成功。这是否保证如果我立即调用 CreateContainer 它将成功?不,因为数据库可能在中间被删除了。

因此,总而言之,如果您想获取其中的任何一个,DatabaseProperties或者出于某种原因想要验证数据库是否存在,ReadAsync 是很好的选择。

最常见的场景只是使用GetDatabase,因为您可能正在尝试沿链进行操作(例如在该数据库的某个容器中创建容器或执行项目级操作)。


推荐阅读