Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizzo di Amazon DynamoDB Nessun database SQL
Nota
I modelli di programmazione descritti in questi argomenti sono presenti in entrambi. NETFramework e. NET(Core), ma le convenzioni di chiamata sono diverse, siano esse sincrone o asincrone.
AWS SDK for .NET Supporta Amazon DynamoDB, un servizio veloce SQL senza database offerto da. AWS SDKFornisce tre modelli di programmazione per comunicare con DynamoDB: il modello di basso livello, il modello di documento e il modello di persistenza degli oggetti.
Le seguenti informazioni introducono questi modelli e i relativi modelliAPIs, forniscono esempi su come e quando utilizzarli e forniscono collegamenti a risorse di programmazione DynamoDB aggiuntive disponibili in. AWS SDK for .NET
Argomenti
Modello di basso livello
Il modello di programmazione di basso livello include le chiamate dirette al servizio DynamoDB. Puoi accedere a questo modello tramite lo spazio dei nomi Amazon.D 2. ynamoDBv
Dei tre modelli, il modello di basso livello richiede di scrivere la maggior parte del codice. Ad esempio, devi convertire. NETtipi di dati ai loro equivalenti in DynamoDB. Tuttavia, questo modello consente di accedere alla maggior parte delle caratteristiche.
Gli esempi seguenti mostrano come utilizzare il modello di basso livello per creare una tabella, modificare una tabella e inserire elementi in una tabella in DynamoDB.
Creazione di una tabella
Nell'esempio seguente, è necessario creare una tabella utilizzando il metodo CreateTable
della classe AmazonDynamoDBClient
. Il metodo CreateTable
utilizza un'istanza della classe CreateTableRequest
che contiene caratteristiche quali i nomi degli attributi degli item richiesti, la definizione della chiave primaria e la capacità di throughput. Il metodo CreateTable
restituisce un'istanza della classe CreateTableResponse
.
// using Amazon.DynamoDBv2; // using Amazon.DynamoDBv2.Model; var client = new AmazonDynamoDBClient(); Console.WriteLine("Getting list of tables"); List<string> currentTables = client.ListTables().TableNames; Console.WriteLine("Number of tables: " + currentTables.Count); if (!currentTables.Contains("AnimalsInventory")) { var request = new CreateTableRequest { TableName = "AnimalsInventory", AttributeDefinitions = new List<AttributeDefinition> { new AttributeDefinition { AttributeName = "Id", // "S" = string, "N" = number, and so on. AttributeType = "N" }, new AttributeDefinition { AttributeName = "Type", AttributeType = "S" } }, KeySchema = new List<KeySchemaElement> { new KeySchemaElement { AttributeName = "Id", // "HASH" = hash key, "RANGE" = range key. KeyType = "HASH" }, new KeySchemaElement { AttributeName = "Type", KeyType = "RANGE" }, }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 10, WriteCapacityUnits = 5 }, }; var response = client.CreateTable(request); Console.WriteLine("Table created with request ID: " + response.ResponseMetadata.RequestId); }
Verificare che una tabella sia pronta per la modifica
Prima di poterla modificare, una tabella deve essere pronta per la modifica. L'esempio seguente mostra come utilizzare il modello di basso livello per verificare che una tabella in DynamoDB sia pronta. In questo esempio, la tabella di destinazione da verificare viene individuata tramite il metodo DescribeTable
della classe AmazonDynamoDBClient
. Ogni cinque secondi, il codice verifica il valore della proprietà TableStatus
della tabella. Quando lo stato è impostato su ACTIVE
, la tabella è pronta per essere modificata.
// using Amazon.DynamoDBv2; // using Amazon.DynamoDBv2.Model; var client = new AmazonDynamoDBClient(); var status = ""; do { // Wait 5 seconds before checking (again). System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5)); try { var response = client.DescribeTable(new DescribeTableRequest { TableName = "AnimalsInventory" }); Console.WriteLine("Table = {0}, Status = {1}", response.Table.TableName, response.Table.TableStatus); status = response.Table.TableStatus; } catch (ResourceNotFoundException) { // DescribeTable is eventually consistent. So you might // get resource not found. } } while (status != TableStatus.ACTIVE);
Inserimento di un item in una tabella
Nell'esempio seguente, si utilizza il modello di basso livello per inserire due elementi in una tabella in DynamoDB. Ciascun item è inserito tramite il metodo PutItem
della classe AmazonDynamoDBClient
, utilizzando un'istanza della classe PutItemRequest
. Ognuna delle due istanze della classe PutItemRequest
richiede il nome della tabella in cui gli item verranno inseriti, con una serie di valori degli attributi degli item.
// using Amazon.DynamoDBv2; // using Amazon.DynamoDBv2.Model; var client = new AmazonDynamoDBClient(); var request1 = new PutItemRequest { TableName = "AnimalsInventory", Item = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue { N = "1" }}, { "Type", new AttributeValue { S = "Dog" }}, { "Name", new AttributeValue { S = "Fido" }} } }; var request2 = new PutItemRequest { TableName = "AnimalsInventory", Item = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue { N = "2" }}, { "Type", new AttributeValue { S = "Cat" }}, { "Name", new AttributeValue { S = "Patches" }} } }; client.PutItem(request1); client.PutItem(request2);
Modello di documento
Il modello di programmazione dei documenti offre un modo più semplice per lavorare con i dati in DynamoDB. Questo modello è progettato in modo specifico per l'accesso alle tabelle e agli item nelle tabelle. È possibile accedere a questo modello tramite ynamoDBvAmazon.D 2. DocumentModelnamespace.
Rispetto al modello di programmazione di basso livello, il modello documentale è più facile da codificare con i dati DynamoDB. Ad esempio, non è necessario convertirne tanti. NETtipi di dati ai loro equivalenti in DynamoDB. Tuttavia, questo modello non consente l'accesso a tutte le caratteristiche del modello di programmazione di basso livello. Ad esempio, è possibile usare questo modello per creare, recuperare, aggiornare ed eliminare gli item nelle tabelle. Tuttavia, per creare le tabelle, è necessario utilizzare il modello di basso livello. Rispetto al modello di persistenza degli oggetti, questo modello richiede la scrittura di più codice da archiviare, caricare e interrogare. NEToggetti.
Per ulteriori informazioni sul modello di programmazione dei documenti DynamoDB, vedere. NET: modello di documento nella Amazon DynamoDB Developer Guide.
Le sezioni seguenti forniscono informazioni su come creare una rappresentazione della tabella DynamoDB desiderata ed esempi su come utilizzare il modello di documento per inserire elementi nelle tabelle e ottenere elementi dalle tabelle.
Creare una rappresentazione della tabella
Per eseguire operazioni sui dati utilizzando il modello di documento, dovete prima creare un'istanza della Table
classe che rappresenti una tabella specifica. Esistono due modi principali per eseguire questa operazione.
LoadTable metodo
Il primo meccanismo consiste nell'utilizzare uno dei LoadTable
metodi statici della Table
classe, simile all'esempio seguente:
var client = new AmazonDynamoDBClient(); Table table = Table.LoadTable(client, "Reply");
Nota
Sebbene questo meccanismo funzioni, in determinate condizioni, a volte può portare a latenze o deadlock aggiuntivi dovuti a comportamenti di avvio a freddo e pool di thread. Per ulteriori informazioni su questi comportamenti, consulta il post del blog Improved DynamoDB Initialization Patterns
TableBuilder
Un meccanismo alternativo, la TableBuilder
classe, è stato introdotto nella versione 3.7.203DescribeTable
Questo meccanismo viene utilizzato in modo simile all'esempio seguente:
var client = new AmazonDynamoDBClient(); var table = new TableBuilder(client, "Reply") .AddHashKey("Id", DynamoDBEntryType.String) .AddRangeKey("ReplyDateTime", DynamoDBEntryType.String) .AddGlobalSecondaryIndex("PostedBy-Message-index", "Author", DynamoDBEntryType.String, "Message", DynamoDBEntryType.String) .Build();
Per ulteriori informazioni su questo meccanismo alternativo, consulta nuovamente il post sul blog Improved DynamoDB Initialization Patterns
Inserimento di un elemento in una tabella
Nell'esempio seguente, una risposta viene inserita nella tabella Reply tramite il PutItemAsync
metodo della Table
classe. Il metodo PutItemAsync
richiede un'istanza della classe Document
; la classe Document
è semplicemente una raccolta di attributi inizializzati.
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DocumentModel; // Create a representation of the "Reply" table // by using one of the mechanisms described previously. // Then, add a reply to the table. var newReply = new Document(); newReply["Id"] = Guid.NewGuid().ToString(); newReply["ReplyDateTime"] = DateTime.UtcNow; newReply["PostedBy"] = "Author1"; newReply["Message"] = "Thank you!"; await table.PutItemAsync(newReply);
Ottenere un elemento da una tabella
Nell'esempio seguente, una risposta viene recuperata tramite il GetItemAsync
metodo della Table
classe. Per determinare la risposta da ottenere, il GetItemAsync
metodo utilizza la chiave hash-and-range primaria della risposta di destinazione.
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DocumentModel; // Create a representation of the "Reply" table // by using one of the mechanisms described previously. // Then, get a reply from the table // where "guid" is the hash key and "datetime" is the range key. var reply = await table.GetItemAsync(guid, datetime); Console.WriteLine("Id = " + reply["Id"]); Console.WriteLine("ReplyDateTime = " + reply["ReplyDateTime"]); Console.WriteLine("PostedBy = " + reply["PostedBy"]); Console.WriteLine("Message = " + reply["Message"]);
L'esempio precedente converte implicitamente i valori della tabella in stringhe per il metodo. WriteLine
È possibile eseguire conversioni esplicite utilizzando i vari metodi «As [type]» della classe. DynamoDBEntry
Ad esempio, puoi convertire in modo esplicito il valore di Id
da un tipo di Primitive
dati a un GUID tramite il metodo: AsGuid()
var guid = reply["Id"].AsGuid();
Modello di persistenza degli oggetti
Il modello di programmazione della persistenza degli oggetti è progettato specificamente per l'archiviazione, il caricamento e l'interrogazione. NEToggetti in DynamoDB. È possibile accedere a questo modello tramite ynamoDBvAmazon.D 2. DataModelnamespace.
Dei tre modelli, il modello di persistenza degli oggetti è il più semplice da utilizzare come codice ogni volta che si archiviano, caricano o interrogano dati DynamoDB. Ad esempio, lavori direttamente con i tipi di dati DynamoDB. Tuttavia, questo modello fornisce l'accesso solo alle operazioni di archiviazione, caricamento e interrogazione. NEToggetti in DynamoDB. Ad esempio, è possibile usare questo modello per creare, recuperare, aggiornare ed eliminare gli item nelle tabelle. Tuttavia, devi prima creare le tabelle utilizzando il modello di basso livello, quindi utilizzare questo modello per mappare le tue. NETdalle classi ai tavoli.
Per ulteriori informazioni sul modello di programmazione della persistenza degli oggetti DynamoDB, vedere. NET: modello di persistenza degli oggetti nella Amazon DynamoDB Developer Guide.
I seguenti esempi mostrano come definire un. NETclasse che rappresenta un elemento DynamoDB, usa un'istanza di. NETclasse per inserire un elemento in una tabella DynamoDB e utilizzare un'istanza di. NETclasse per ottenere un elemento dalla tabella.
Definizione di un. NETclasse che rappresenta un elemento in una tabella
Nel seguente esempio di definizione di classe, l'DynamoDBTable
attributo specifica il nome della tabella, mentre gli DynamoDBRangeKey
attributi DynamoDBHashKey
e modellano la chiave hash-and-range primaria della tabella. L'DynamoDBGlobalSecondaryIndexHashKey
attributo è definito in modo da poter creare una query per le risposte di un autore specifico.
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DataModel; [DynamoDBTable("Reply")] public class Reply { [DynamoDBHashKey] public string Id { get; set; } [DynamoDBRangeKey(StoreAsEpoch = false)] public DateTime ReplyDateTime { get; set; } [DynamoDBGlobalSecondaryIndexHashKey("PostedBy-Message-Index", AttributeName ="PostedBy")] public string Author { get; set; } [DynamoDBGlobalSecondaryIndexRangeKey("PostedBy-Message-Index")] public string Message { get; set; } }
Creazione di un contesto per il modello di persistenza degli oggetti
Per utilizzare il modello di programmazione della persistenza degli oggetti per DynamoDB, è necessario creare un contesto che fornisca una connessione a DynamoDB e consenta di accedere alle tabelle, eseguire varie operazioni ed eseguire query.
Contesto di base
L'esempio seguente mostra come creare il contesto più semplice.
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DataModel; var client = new AmazonDynamoDBClient(); var context = new DynamoDBContext(client);
Contesto con DisableFetchingTableMetadata proprietà
L'esempio seguente mostra come è possibile impostare ulteriormente la DisableFetchingTableMetadata
proprietà della DynamoDBContextConfig
classe per impedire chiamate implicite al DescribeTable
metodo.
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DataModel; var client = new AmazonDynamoDBClient(); var context = new DynamoDBContext(client, new DynamoDBContextConfig { DisableFetchingTableMetadata = true });
Se la DisableFetchingTableMetadata
proprietà è impostata su false
(impostazione predefinita), come mostrato nel primo esempio, potete omettere dalla classe gli attributi che descrivono la struttura delle chiavi e degli indici degli elementi della tabella. Reply
Questi attributi verranno invece dedotti tramite una chiamata implicita al metodo. DescribeTable
If DisableFetchingTableMetadata
è impostato sutrue
, come mostrato nel secondo esempio, sui metodi del modello di persistenza degli oggetti come SaveAsync
e QueryAsync
si basa interamente sugli attributi definiti nella classe. Reply
In questo caso, non viene effettuata una chiamata al DescribeTable
metodo.
Nota
In determinate condizioni, le chiamate al DescribeTable
metodo possono talvolta portare a latenze o deadlock aggiuntivi dovuti a comportamenti di avvio a freddo e pool di thread. Per questo motivo, a volte è vantaggioso evitare le chiamate a quel metodo.
Per ulteriori informazioni su questi comportamenti, consulta il post del blog Improved DynamoDB Initialization Patterns
Utilizzando un'istanza di. NETclasse per inserire un elemento in una tabella
In questo esempio, un elemento viene inserito tramite il SaveAsync
metodo della DynamoDBContext
classe, che accetta un'istanza inizializzata di. NETclasse che rappresenta l'elemento.
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DataModel; // Create an appropriate context for the object persistence programming model, // examples of which have been described earlier. // Create an object that represents the new item. var reply = new Reply() { Id = Guid.NewGuid().ToString(), ReplyDateTime = DateTime.UtcNow, Author = "Author1", Message = "Thank you!" }; // Insert the item into the table. await context.SaveAsync<Reply>(reply, new DynamoDBOperationConfig { IndexName = "PostedBy-Message-index" });
Utilizzando un'istanza di a. NETclasse per ottenere elementi da una tabella
In questo esempio, viene creata una query per trovare tutti i record di «Author1" utilizzando il QueryAsync
metodo della DynamoDBContext
classe. Quindi, gli elementi vengono recuperati tramite il metodo della query. GetNextSetAsync
using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.DataModel; // Create an appropriate context for the object persistence programming model, // examples of which have been described earlier. // Construct a query that finds all replies by a specific author. var query = context.QueryAsync<Reply>("Author1", new DynamoDBOperationConfig { IndexName = "PostedBy-Message-index" }); // Display the result. var set = await query.GetNextSetAsync(); foreach (var item in set) { Console.WriteLine("Id = " + item.Id); Console.WriteLine("ReplyDateTime = " + item.ReplyDateTime); Console.WriteLine("PostedBy = " + item.Author); Console.WriteLine("Message = " + item.Message); }
Informazioni aggiuntive sul modello di persistenza degli oggetti
Gli esempi e le spiegazioni mostrati sopra a volte includono una proprietà della DynamoDBContext
classe chiamata. DisableFetchingTableMetadata
Questa proprietà, introdotta nella versione 3.7.203 del NuGet pacchetto AWSSDK .D ynamoDBv 2, consente di
Di seguito sono riportate alcune informazioni aggiuntive su questa proprietà.
-
Questa proprietà può essere impostata globalmente nel tuo
web.config
fileapp.config
o, se lo stai utilizzando. NETStruttura. -
Questa proprietà può essere impostata globalmente utilizzando la
AWSConfigsDynamoDB
classe, come illustrato nell'esempio seguente.// Set the DisableFetchingTableMetadata property globally // before constructing any context objects. AWSConfigsDynamoDB.Context.DisableFetchingTableMetadata = true; var client = new AmazonDynamoDBClient(); var context = new DynamoDBContext(client);
-
In alcuni casi, non è possibile aggiungere attributi DynamoDB a. NETclasse; ad esempio, se la classe è definita in una dipendenza. In questi casi, è comunque possibile sfruttare la
DisableFetchingTableMetadata
proprietà. A tale scopo, utilizzate laTableBuilder
classe in aggiunta allaDisableFetchingTableMetadata
proprietà. LaTableBuilder
classe è stata introdotta anche nella versione 3.7.203 del pacchetto AWSSDK D.2. ynamoDBv NuGet// Set the DisableFetchingTableMetadata property globally // before constructing any context objects. AWSConfigsDynamoDB.Context.DisableFetchingTableMetadata = true; var client = new AmazonDynamoDBClient(); var context = new DynamoDBContext(client); var table = new TableBuilder(client, "Reply") .AddHashKey("Id", DynamoDBEntryType.String) .AddRangeKey("ReplyDateTime", DynamoDBEntryType.String) .AddGlobalSecondaryIndex("PostedBy-Message-index", "Author", DynamoDBEntryType.String, "Message", DynamoDBEntryType.String) .Build(); // This registers the "Reply" table we constructed via the builder. context.RegisterTableDefinition(table); // Now operations like this will work, // even if the Reply class was not annotated with this index. var query = context.QueryAsync<Reply>("Author1", new DynamoDBOperationConfig() { IndexName = "PostedBy-Message-index" });
Ulteriori informazioni
Utilizzo di informazioni ed AWS SDK for .NET esempi per programmare DynamoDB**
Informazioni ed esempi sul modello di basso livello
-
Lavorare con le tabelle utilizzando il livello basso AWS SDK for .NET API
-
Lavorare con gli elementi utilizzando il livello basso AWS SDK for .NET API
-
Interrogazione di tabelle utilizzando il livello basso AWS SDK for .NET API
-
Scansione delle tabelle utilizzando il livello basso AWS SDK for .NET API
-
Utilizzo degli indici secondari locali utilizzando il livello basso AWS SDK for .NET API
-
Utilizzo degli indici secondari globali utilizzando il livello basso AWS SDK for .NET API
Informazioni ed esempi sul modello di documento
Informazioni ed esempi sul modello di persistenza degli oggetti