.NET 对象持久化模型中的 DynamoDBContext 类
DynamoDBContext
类是 Amazon DynamoDB 的入口点。这个类提供到 DynamoDB 的连接,让您能够访问各种表的数据,执行各种 CRUD 操作,以及执行查询。DynamoDBContext
类提供了以下方法。
主题
CreateMultiTableBatchGet
创建 MultiTableBatchGet
对象,由多个单独 BatchGet
对象组成。每个 BatchGet
对象可用于从单个 DynamoDB 表中检索项目。
要从表中检索项目,请使用 ExecuteBatchGet
方法,传递 MultiTableBatchGet
对象作为参数。
CreateMultiTableBatchWrite
创建 MultiTableBatchWrite
对象,由多个单独 BatchWrite
对象组成。每个 BatchWrite
对象可用于写入或删除单个 DynamoDB 表中的项目。
要写入表,请使用 ExecuteBatchWrite
方法,传递 MultiTableBatchWrite
对象作为参数。
CreateBatchGet
创建 BatchGet
对象,可以用于从表中检索多个项目。
CreateBatchWrite
创建 BatchWrite
对象,可以用于将多个项目放入表中,或者从表中删除多个项目。
删除
删除表中的项目。此方法需要要删除的项目的主键。您可以提供主键值或包含主键值的客户端对象作为此方法的参数。
-
如果将客户端对象指定为参数,并且启用了乐观锁定,则只有在对象的客户端版本和服务器端版本匹配时,删除才会成功。
-
如果仅将主键值指定为参数,则无论您是否启用了乐观锁定,删除都会成功。
注意
要在后台执行此操作,请使用 DeleteAsync
方法。
Dispose
处置所有托管和非托管资源。
ExecuteBatchGet
从一个或多个表中读取数据,处理 MultiTableBatchGet
中的所有 BatchGet
对象。
注意
要在后台执行此操作,请使用ExecuteBatchGetAsync
方法。
ExecuteBatchWrite
在一个或多个表中写入或删除数据,处理 MultiTableBatchWrite
中的所有 BatchWrite
对象。
注意
要在后台执行此操作,请使用ExecuteBatchWriteAsync
方法。
FromDocument
给定一个 Document
实例,FromDocument
方法返回客户端类的实例。
如果要将文档模型类与对象持久化模型一起使用来执行任何数据操作,这将非常有用。有关 AWS SDK for .NET 提供的文档模型类的更多信息,请参阅在 DynamoDB 中使用 .NET 文档模型。
假设您有一个名为 doc
的 Document
对象,其中包含 Forum
项目。(要了解如何构造此对象,请参阅本主题稍后的 ToDocument
方法说明。) 您可以使用 FromDocument
从 Document
检索 Forum
项目,如以下 C# 代码示例所示。
例
forum101 = context.FromDocument<Forum>(101);
注意
如果您的Document
对象实现IEnumerable
接口,您可以使用FromDocuments
方法。这允许您遍历Document
的所有类实例。
FromQuery
运行Query
操作,查询参数定义在QueryOperationConfig
对象。
注意
要在后台执行此操作,请使用FromQueryAsync
方法。
FromScan
运行Scan
操作,扫描参数定义在ScanOperationConfig
对象。
注意
要在后台执行此操作,请使用FromScanAsync
方法。
GetTargetTable
检索指定类型的目标表。如果您正在编写用于将任意数据映射到 DynamoDB 表的自定义转换器,并且需要确定哪个表与自定义数据类型相关联,则此选项非常有用。
Load
检索表中的项目。方法只需要要检索的项目的主键。
默认情况下,DynamoDB 所返回的项目的值采用最终一致性。有关最终一致性模式的信息,请参阅DynamoDB 读取一致性。
Load
或 LoadAsync
方法调用 GetItem 操作,该操作要求您为表指定主键。由于 GetItem
忽略了 IndexName
参数,因此您无法使用索引的分区或排序键加载项目。因此,必须使用表的主键来加载项目。
注意
要在后台执行此操作,请使用 LoadAsync
方法。要查看使用 LoadAsync
方法对 DynamoDB 表执行高级 CRUD 操作的示例,请参阅以下示例。
/// <summary> /// Shows how to perform high-level CRUD operations on an Amazon DynamoDB /// table. /// </summary> public class HighLevelItemCrud { public static async Task Main() { var client = new AmazonDynamoDBClient(); DynamoDBContext context = new DynamoDBContext(client); await PerformCRUDOperations(context); } public static async Task PerformCRUDOperations(IDynamoDBContext context) { int bookId = 1001; // Some unique value. Book myBook = new Book { Id = bookId, Title = "object persistence-AWS SDK for.NET SDK-Book 1001", Isbn = "111-1111111001", BookAuthors = new List<string> { "Author 1", "Author 2" }, }; // Save the book to the ProductCatalog table. await context.SaveAsync(myBook); // Retrieve the book from the ProductCatalog table. Book bookRetrieved = await context.LoadAsync<Book>(bookId); // Update some properties. bookRetrieved.Isbn = "222-2222221001"; // Update existing authors list with the following values. bookRetrieved.BookAuthors = new List<string> { " Author 1", "Author x" }; await context.SaveAsync(bookRetrieved); // Retrieve the updated book. This time, add the optional // ConsistentRead parameter using DynamoDBContextConfig object. await context.LoadAsync<Book>(bookId, new DynamoDBContextConfig { ConsistentRead = true, }); // Delete the book. await context.DeleteAsync<Book>(bookId); // Try to retrieve deleted book. It should return null. Book deletedBook = await context.LoadAsync<Book>(bookId, new DynamoDBContextConfig { ConsistentRead = true, }); if (deletedBook == null) { Console.WriteLine("Book is deleted"); } } }
查询
根据您提供的查询参数查询表。
只有当表或索引具有复合主键(分区键和排序键)时,您才能对其执行查询。在查询时,您必须指定分区键以及适用于排序键的条件。
假设您有一个客户端Reply
类映射到 DynamoDB 的 Reply
表。以下 C# 代码示例查询 Reply
以查找过去 15 天内发布的论坛话题回复。这些区域有:Reply
表中有一个主键,该主键具有Id
分区键和ReplyDateTime
排序键。
例
DynamoDBContext context = new DynamoDBContext(client); string replyId = "DynamoDB#DynamoDB Thread 1"; //Partition key DateTime twoWeeksAgoDate = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); // Date to compare. IEnumerable<Reply> latestReplies = context.Query<Reply>(replyId, QueryOperator.GreaterThan, twoWeeksAgoDate);
该查询会一系列 Reply
对象。
在默认情况下,Query
方法返回“延迟加载”IEnumerable
集合。它最初只返回一页结果,然后在需要时发出服务调用请求下一页结果。要获取所有匹配项目,请对 IEnumerable
集合进行迭代。
如果表具有简单主键(分区键),则无法使用 Query
方法。相反,您可以使用Load
方法并提供用于检索项目的分区键。
注意
要在后台执行此操作,请使用QueryAsync
方法。
Save(保存)
将指定对象保存到表中。如果表中不存在输入对象中指定的主键,则方法会将新项目添加到表中。如果存在主键,此方法就会更新现有项目。
如果您配置了乐观锁定,则仅当客户端和项目的服务器端版本匹配时,更新才会成功。有关更多信息,请参阅 将 DynamoDB 和 AWS SDK for .NET 对象持久化模型结合使用的乐观锁。
注意
要在后台执行此操作,请使用SaveAsync
方法。
扫描
执行整个表扫描。
您可以通过指定扫描条件来筛选扫描结果。可以根据表中的任何属性对条件进行评估。假设您有一个客户端类 Book
映射到 DynamoDB 的 ProductCatalog
表。以下 C# 示例扫描表并仅返回价格小于 0 的书籍项目。
例
IEnumerable<Book> itemsWithWrongPrice = context.Scan<Book>( new ScanCondition("Price", ScanOperator.LessThan, price), new ScanCondition("ProductCategory", ScanOperator.Equal, "Book") );
在默认情况下,Scan
方法返回“延迟加载”IEnumerable
集合。它最初只返回一页结果,然后在需要时发出服务调用请求下一页结果。要获取所有匹配项,请对 IEnumerable
集合进行迭代。
出于性能考虑,您应查询表并避免表扫描。
注意
要在后台执行此操作,请使用ScanAsync
方法。
ToDocument
返回类实例中的 Document
文档模型类。
如果要将文档模型类与对象持久化模型一起使用来执行任何数据操作,这将非常有用。有关 AWS SDK for .NET 提供的文档模型类的更多信息,请参阅在 DynamoDB 中使用 .NET 文档模型。
假设您有一个映射到示例 Forum
表的客户端类。然后,您可以使用 DynamoDBContext
从 Forum
表获取一个项目作为 Document
对象,如以下 C# 代码示例所示。
例
DynamoDBContext context = new DynamoDBContext(client); Forum forum101 = context.Load<Forum>(101); // Retrieve a forum by primary key. Document doc = context.ToDocument<Forum>(forum101);
指定 DynamoDBContext 的可选参数
使用对象持久化模型时,您可以为 DynamoDBContext
指定以下可选参数。
-
ConsistentRead
—使用Load
、Query
或Scan
操作检索数据时,可以添加此可选参数来请求数据的最新值。 -
IgnoreNullValues
—此参数通知DynamoDBContext
在Save
操作时忽略属性空值。如果此参数为 false(或未设置),则空值将被解释为删除特定属性的指令。 -
SkipVersionCheck
—此参数通知DynamoDBContext
保存或删除项目时不比较版本。有关版本控制的更多信息,请参阅将 DynamoDB 和 AWS SDK for .NET 对象持久化模型结合使用的乐观锁。 -
TableNamePrefix
—在所有表名称前加上特定字符串。如果此参数为 null(或未设置),则不使用前缀。 -
DynamoDBEntryConversion
– 指定客户端使用的转换架构。可以将此参数设置为版本 V1 或 V2。默认版本是 V1。根据您设置的版本,此参数的行为会发生变化。例如:
-
在 V1 中,
bool
数据类型转换为N
数字类型,其中 0 代表 false,1 代表 true。在 V2 中,bool
转换为BOOL
。 -
在 V2 中,列表和数组不与哈希集组合在一起。数字、基于字符串的类型和基于二进制的类型的列表和数组将转换为
L
(列表)类型,该类型可以发送空值以更新列表。这与 V1 不同,在 V1 中,不通过网络发送空列表。在 V1 中,集合类型(例如列表、哈希集和数组)的处理方式相同。列表、哈希集和数组将转换为
NS
(数字集)类型。
以下示例将转换架构版本设置为 V2,这会更改 .NET 类型和 DynamoDB 数据类型之间的转换行为。
var config = new DynamoDBContextConfig { Conversion = DynamoDBEntryConversion.V2 }; var contextV2 = new DynamoDBContext(client, config);
-
下面的 C# 示例通过指定前面的两个可选参数(ConsistentRead
和 SkipVersionCheck
),来创建一个新的 DynamoDBContext
。
例
AmazonDynamoDBClient client = new AmazonDynamoDBClient(); ... DynamoDBContext context = new DynamoDBContext(client, new DynamoDBContextConfig { ConsistentRead = true, SkipVersionCheck = true});
DynamoDBContext
包含这些可选参数以及您使用此上下文发送的每个请求。
不在 DynamoDBContext
级别设置这些参数,可以为使用 DynamoDBContext
运行的各个操作指定,如以下 C# 代码示例所示。此示例加载特定的图书项目。DynamoDBContext
的 Load
方法指定 ConsistentRead
和 SkipVersionCheck
可选参数。
例
AmazonDynamoDBClient client = new AmazonDynamoDBClient(); ... DynamoDBContext context = new DynamoDBContext(client); Book bookItem = context.Load<Book>(productId,new DynamoDBContextConfig{ ConsistentRead = true, SkipVersionCheck = true });
在这种情况下,DynamoDBContext
仅在发送 Get
请求时包含这些参数。