使用对象持久化模型 - AWS Mobile SDK

AWS SDK for .NET 现在包括适用于 Xamarin 的 AWS Mobile SDK。本指南参考了适用于 Xamarin 的 Mobile SDK 的存档版本。

使用对象持久化模型

借助适用于 .NET 和 Xamarin 的 AWS Mobile SDK 提供的对象持久化模型,您能够将客户端类映射到 DynamoDB 表。然后,每个对象实例都可以映射到对应表中的项目。为了在表中保存您的客户端对象,对象持久化模型提供了 DynamoDBContext 类,这是 DynamoDB 的入口点。这个类提供到 DynamoDB 的连接,让您能够访问表、执行各种 CRUD 操作,以及执行查询。

对象持久化模型不提供用于创建、更新或删除表的 API。它只提供数据操作。要创建、更新和删除表,您必须使用低级别 API。有关如何使用低级别 API 的说明,请参阅使用 DynamoDB 服务级别 API

概述

对象持久化模型提供一系列特性,用于将客户端类映射到表,以及将属性/字段映射到表属性。对象持久化模型支持类属性和表属性之间的明确映射和默认映射。

  • 显式映射:要将属性映射到主键,您必须使用 DynamoDBHashKey 和 DynamoDBRangeKey 对象持久化模型属性。此外,对于非主键特性,如果类中的属性名称与您希望将其映射到的对应表特性名称不同,那么您必须通过明确添加 DynamoDBProperty 特性定义这一映射。

  • 默认映射 – 默认情况下,对象持久化模型会将类属性映射到表中同名的特性。

您无需映射每一个类属性,而是可以通过添加 DynamoDBIgnore 特性来标识这些属性。保存和检索对象的实例会忽略用此特性标记的任何属性。

支持的数据类型

对象持久化模型支持一系列 .NET 基元数据类型、集合数据类型和其他任意数据类型。该模型支持以下基元数据类型。

  • 布尔

  • 字节

  • char

  • DateTime

  • decimal、double、float

  • Int16、Int32、Int64

  • SByte

  • 字符串

  • UInt16、UInt32、UInt64

对象持久化模型也支持 .NET 集合类型,但有以下限制:

  • 集合类型必须实施 ICollection 接口。

  • 集合类型必须由支持的基元类型组成。例如,ICollection<string>、ICollection<bool>。

  • 集合类型必须提供无参数构造函数。

有关对象持久化模型的更多信息,请参阅 .NET 对象持久化模型

创建 DynamoDB 客户端

创建 DynamoDB 客户端:

var client = new AmazonDynamoDBClient(credentials,region); DynamoDBContext context = new DynamoDBContext(client);

CRUD 操作

保存对象

创建对象:

[DynamoDBTable("Books")] public class Book { [DynamoDBHashKey] // Hash key. public string Id { get; set; } [DynamoDBGlobalSecondaryIndexHashKey] public string Author { get; set; } [DynamoDBGlobalSecondaryIndexRangeKey] public string Title { get; set; } public string ISBN { get; set; } public int Price { get; set; } public string PageCount { get; set; } } Book myBook = new Book { Id = id, Author = "Charles Dickens", Title = "Oliver Twist", ISBN = "111-1111111001", Price = 10, PageCount = 300 };

将对象保存到 DynamoDB 表中:

context.Save(myBook);

检索对象

检索对象:

Book retrievedBook = context.Load<Book>(1);

更新对象

更新对象:

Book retrievedBook = context.Load<Book>(1); retrievedBook.ISBN = "111-1111111001"; context.Save(retrievedBook);

删除数据元

删除对象:

Book retrievedBook = context.Load<Book>(1); context.Delete(retrievedBook);

查询和扫描

查询和检索作者为“Charles Dickens”的所有图书:

public async Task QueryAsync(AWSCredentials credentials, RegionEndpoint region) { var client = new AmazonDynamoDBClient(credentials, region); DynamoDBContext context = new DynamoDBContext(client); var search = context.FromQueryAsync < Book > (new Amazon.DynamoDBv2.DocumentModel.QueryOperationConfig() { IndexName = "Author-Title-index", Filter = new Amazon.DynamoDBv2.DocumentModel.QueryFilter("Author", Amazon.DynamoDBv2.DocumentModel.QueryOperator.Equal, "Charles Dickens") }); Console.WriteLine("items retrieved"); var searchResponse = await search.GetRemainingAsync(); searchResponse.ForEach((s) = > { Console.WriteLine(s.ToString()); }); }

下面的扫描示例代码返回我们的表中的所有图书:

public async Task ScanAsync(AWSCredentials credentials, RegionEndpoint region) { var client = new AmazonDynamoDBClient(credentials, region); DynamoDBContext context = new DynamoDBContext(client); var search = context.FromScanAsync < Book > (new Amazon.DynamoDBv2.DocumentModel.ScanOperationConfig() { ConsistentRead = true }); Console.WriteLine("items retrieved"); var searchResponse = await search.GetRemainingAsync(); searchResponse.ForEach((s) = > { Console.WriteLine(s.ToString()); }); }