2 votes

Liste des cartes dans un modèle de données DynamoDB

Nous disposons d'un modèle de données avec des propriétés définies, mais l'une des propriétés permet d'utiliser des métadonnées dynamiques (une liste de cartes ou de dictionnaires). En utilisant le modèle de document, cette propriété correspond bien à une liste de Document Cependant, lorsque j'ai du mal à faire correspondre cette propriété dynamique à quoi que ce soit en utilisant DataModel . Existe-t-il un moyen de faire correspondre des données dynamiques à des documents à l'intérieur d'une propriété de classe de modèle ?

La tentative de le mapper en tant que liste de dictionnaires (qui correspond à la structure des métadonnées) échoue avec l'erreur suivante :

public List<Dictionary<string, object>> Events { get; set; }

Impossible de convertir [Amazon.DynamoDBv2.DocumentModel.Document] de type Amazon.DynamoDBv2.DocumentModel.Document vers System.Collections.Generic.Dictionary`

En utilisant un type de List<Document> m'a permis d'obtenir le résultat le plus proche, à savoir une liste de 39 documents, mais tous les documents ont 0 clé, 0 valeur.

public List<Document> Events { get; set; }

Ex :

document["Events"].AsListOfDocument().First(); // works, contains the keys and values

datamodel.Events.First(); // does not work, it is an empty document

4voto

Gelo Points 41

Je sais que c'est un peu ancien mais j'espère que cela pourra aider quelqu'un d'autre à résoudre ce problème.

Salut Devon,

Dans le cas où vous essayez de créer l'objet pour l'envoyer à votre DynamoDB, vous pouvez essayer de mapper des données arbitraires comme indiqué dans la section Documentation AWS pour .NET

Voici le code tiré de la documentation :

try
        {
            DynamoDBContext context = new DynamoDBContext(client);

            // 1. Create a book.
            DimensionType myBookDimensions = new DimensionType()
            {
                Length = 8M,
                Height = 11M,
                Thickness = 0.5M
            };

            Book myBook = new Book
            {
                Id = 501,
                Title = "AWS SDK for .NET Object Persistence Model Handling Arbitrary Data",
                ISBN = "999-9999999999",
                BookAuthors = new List<string> { "Author 1", "Author 2" },
                Dimensions = myBookDimensions
            };

            context.Save(myBook);

Une fois que vous avez vos données dans la base de données, vous pouvez ajouter une nouvelle carte à la liste avec quelque chose du genre :

var request = new UpdateItemRequest
            {
                TableName = "TableName",
                Key = new Dictionary<string, AttributeValue>() { { "PartitionKey", new AttributeValue { S = "value" } } },
                ExpressionAttributeNames = new Dictionary<string, string>()
                {
                    { "#A", "A" }
                },
                ExpressionAttributeValues = new Dictionary<string, AttributeValue>()
                {
                    {
                        ":val", new AttributeValue
                        {
                            L = new List<AttributeValue>()
                            {
                                {
                                    new AttributeValue
                                    {
                                        M = new Dictionary<string, AttributeValue>()
                                        {
                                            { "Address", new AttributeValue{S = "Value" } },
                                            { "Latitude", new AttributeValue {  S =  position.Latitude.ToString() } },
                                            { "Longitude", new AttributeValue {  S =  position.Longitude.ToString() } }
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                UpdateExpression = "SET #A = list_append(#A, :val)"
            };

            try
            {
                var response = await client.UpdateItemAsync(request);

            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }

Cela a marché pour moi, j'espère que cela marchera pour quelqu'un d'autre.

. . .

PS : BTW c'est ma première réponse dans Stackoverflow et cela fait du bien d'essayer de contribuer alors que je suis venu ici plusieurs fois pour des réponses qui m'ont fait gagner du temps jajajaja.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X