

适用于 Xamarin 的 AWS 移动 SDK 现已包含在。 适用于 .NET 的 AWS SDK本指南参考了适用于 Xamarin 的 Mobile SDK 的存档版本。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用对象持久化模型
<a name="dynamodb-integration-objectpersistencemodel"></a>

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

对象持久化模型不提供用于创建、更新或删除表的 API。它只提供数据操作。要创建、更新和删除表，您必须使用低级别 API。有关如何使用低级 API 的说明，请参阅[使用 DynamoDB 服务](dynamodb-integration-lowlevelapi.md)级别。 APIs

## 概述
<a name="overview"></a>

对象持久化模型提供了一组属性，用于将客户端类映射到表和 properties/fields 表属性。对象持久化模型支持类属性和表属性之间的明确映射和默认映射。
+  **显式映射**：要将属性映射到主键，必须使用 Dynamo K DBHash ey 和 Dynamo K DBRange ey 对象持久化模型属性。此外，对于非主键属性，如果类中的属性名称与要将其映射到的相应表属性不相同，则必须通过显式添加 Dynamo DBProperty 属性来定义映射。
+  **默认映射** – 默认情况下，对象持久化模型会将类属性映射到表中同名的特性。

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

## 支持的数据类型
<a name="supported-data-types"></a>

对象持久化模型支持一系列 .NET 基元数据类型、集合数据类型和其他任意数据类型。该模型支持以下基元数据类型。
+ 布尔
+ 字节
+ char
+ DateTime
+ decimal、double、float
+ Int16、Int32、Int64
+ SByte
+ 字符串
+ UInt16, UInt32, UInt64

对象持久化模型也支持 .NET 集合类型，但有以下限制：
+ 集合类型必须实现 ICollection 接口。
+ 集合类型必须由支持的基元类型组成。例如， ICollection<string>， ICollection<bool>。
+ 集合类型必须提供无参数构造函数。

有关对象持久化模型的更多信息，请参阅 [.NET 对象持久化模型](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DotNetSDKHighLevel.html)。

## 创建 DynamoDB 客户端
<a name="create-a-dynamodb-client"></a>

创建 DynamoDB 客户端：

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

## CRUD 操作
<a name="crud-operations"></a>

### 保存对象
<a name="save-an-object"></a>

创建对象：

```
[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);
```

### 检索对象
<a name="retrieve-an-object"></a>

检索对象：

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

### 更新对象
<a name="update-an-object"></a>

更新对象：

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

### 删除对象
<a name="delete-an-object"></a>

删除对象：

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

## 查询和扫描
<a name="query-and-scan"></a>

查询和检索作者为“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());
  });
}
```