本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
.NET 物件持久性模型中的 D ynamoDBContext 類別
DynamoDBContext
類別是 Amazon DynamoDB 資料庫的進入點。它提供 DynamoDB 的連線,可讓您存取各種資料表中的資料、執行各種CRUD操作,以及執行查詢。此 DynamoDBContext
類別提供下列方法。
主題
建立MultiTableBatchGet
建立由多個個別 BatchGet
物件組成的 MultiTableBatchGet
物件。其中的每個 BatchGet
物件都可用來從單一 DynamoDB 資料表中擷取項目。
若要從資料表擷取項目,請使用 ExecuteBatchGet
方法,將 MultiTableBatchGet
物件作為參數傳遞。
建立MultiTableBatchWrite
建立由多個個別 BatchWrite
物件組成的 MultiTableBatchWrite
物件。其中的每個 BatchWrite
物件可用來寫入或刪除單一 DynamoDB 資料表中的項目。
若要寫入資料表,請使用 ExecuteBatchWrite
方法,將 MultiTableBatchWrite
物件作為參數傳遞。
CreateBatchGet
建立 BatchGet
物件,您可以使用該物件從資料表中擷取多個項目。
CreateBatchWrite
建立 BatchWrite
物件,您可以使用該物件將多個項目放入資料表中,或從資料表中刪除多個項目。
Delete
刪除資料表中的項目。這個方法需要您希望刪除之項目的主索引鍵。您可以提供主索引鍵值或包含主索引鍵值的用戶端物件,作為此方法的參數。
-
如果指定用戶端物件作為參數,且已啟用樂觀鎖定,則只有在物件的用戶端和伺服器端版本相符時,才能成功刪除項目。
-
如果只指定主索引鍵值作為參數,無論您是否已啟用樂觀鎖定,刪除都會成功。
注意
若要在背景執行此操作,請改用 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
以 QueryOperationConfig
物件中定義的查詢參數執行 Query
操作。
注意
若要在背景執行此操作,請改用 FromQueryAsync
方法。
FromScan
以 ScanOperationConfig
物件中定義的掃描參數執行 Scan
操作。
注意
若要在背景執行此操作,請改用 FromScanAsync
方法。
GetTargetTable
擷取指定類型的目標資料表。如果您正在撰寫自訂轉換器,將任意資料映射至 DynamoDB 資料表,而且需要判斷哪個資料表與自訂資料類型相關聯,則此功能非常有用。
載入
從資料表擷取項目。這個方法只需要您希望擷取之項目的主索引鍵。
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"); } } }
Query
根據您提供的查詢參數查詢資料表。
您只能查詢具有複合主索引鍵 (分割區索引鍵和排序索引鍵) 的資料表。查詢時,必須指定分割區索引鍵和套用至排序索引鍵的條件。
假設您有用戶端 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
方法。
Scan
執行整個資料表掃描。
您可以指定掃描條件來篩選掃描結果。您可以根據資料表中的任何屬性來評估條件。假設您有用戶端 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);
指定 D 的選用參數ynamoDBContext
使用物件持久性模型時,您可以指定 DynamoDBContext
的下列選用參數。
-
ConsistentRead
:當使用Load
、Query
或Scan
操作來擷取資料時,您可以新增此選用參數來請求資料的最新數值。 -
IgnoreNullValues
:此參數會通知DynamoDBContext
在Save
操作期間忽略屬性上的 Null 數值。如果此參數為 false (或未設定),則會將 Null 數值轉譯為刪除特定屬性的指令。 -
SkipVersionCheck
:此參數會通知DynamoDBContext
不要在儲存或刪除項目時比較版本。如需版本控制的詳細資訊,請參閱「使用 DynamoDB 和 AWS SDK for .NET 物件持久性模型的最佳化鎖定」。 -
TableNamePrefix
:使用特定字串作為所有資料表名稱的字首。如果此參數為 null (或未設定),則不會使用字首。 -
DynamoDBEntryConversion
– 指定用戶端使用的轉換結構描述。您可以將此參數設定為版本 V1 或 V2。V1 是預設版本。根據您設定的版本,此參數的行為會變更。例如:
-
在 V1 中,
bool
資料類型會轉換為N
數字類型,其中 0 代表 false,1 代表 true。在 V2 中,bool
會轉換為BOOL
。 -
在 V2 中,清單和陣列不會與 一起分組 HashSets。數值、字串型類型和二進位型類型的清單和陣列會轉換為
L
(清單) 類型,可以空傳送來更新清單。這與 V1 不同,其中空白清單不會透過電匯傳送。在 V1 中,集合類型,例如 List HashSet和陣列都視為相同。清單 HashSet, 和 數值陣列會轉換為
NS
(資料集) 類型。
下列範例會將轉換結構描述版本設定為 V2,這會變更 .NET 類型和 DynamoDB 資料類型之間的轉換行為。
var config = new DynamoDBContextConfig { Conversion = DynamoDBEntryConversion.V2 }; var contextV2 = new DynamoDBContext(client, config);
-
下列 C# 範例DynamoDBContext
會指定上述兩個選用參數 ConsistentRead
和 來建立新的 參數SkipVersionCheck
。
範例
AmazonDynamoDBClient client = new AmazonDynamoDBClient(); ... DynamoDBContext context = new DynamoDBContext(client, new DynamoDBContextConfig { ConsistentRead = true, SkipVersionCheck = true});
DynamoDBContext
包含這些選用參數,以及您使用此內容傳送的每個請求。
您可以使用 DynamoDBContext
為個別操作指定參數,而不是在 DynamoDBContext
層級設定這些參數,如下列 C# 程式碼範例所示。此範例會載入特定的書籍項目。Load
的方法DynamoDBContext
指定 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
請求時才會包含這些參數。