Модель персистентности DynamoDb с данными расширения - PullRequest
1 голос
/ 11 октября 2019

У меня есть модель

class Person
{
    [DynamoDBHashKey("PK")]
    public string Id {get;set;}

    [DynamoDBProperty()]
    public string Name {get;set;}
}

В моей таблице DynamoDb есть много людей с разными атрибутами, но Name является обязательным атрибутом в моей системе.

Я хочу получить этот видчеловека из базы данных:

{
    "PK":"123",
    "Name": "John",
    "Position": "Developer",
    "Address": "NY"
}

и сопоставьте его с моей постоянной моделью, но кроме Name Я также хочу получить все атрибуты, которые не были сопоставлены.

Так что я полагаюрасширить мою модель так:

class Person
{
    [DynamoDBHashKey("PK")]
    public string Id {get;set;}

    [DynamoDBProperty()]
    public string Name {get;set;}

    public Dictionary<string, string> AllOtherProperties {get;set;}
}

Есть ли шанс сделать это?

Я знаю, что при десериализации json мы можем использовать атрибут [JsonExtensionData], поэтому я ищу похожее поведение.

1 Ответ

0 голосов
/ 11 октября 2019

К сожалению, я не верю, что это возможно сделать с помощью DynamoDBContext. Если все ваши дополнительные свойства не находятся в разделе «AllOtherPropertiesAttribute» (я сомневаюсь, что это так, особенно в соответствии с вашим примером).

Но вы можете перейти на более низкий уровень и попробовать низкоуровневый клиент DynamodB, который возвращает атрибуткарта. В этом случае вы сможете сохранять другие поля в словаре.

    var result = await client.GetItemAsync("persontable", new Dictionary<string, AttributeValue>
    {
        {  "PK", new AttributeValue { S = "MYID123" } }
    });

    var person = new Person
    {
        Id = result.Item["PK"].S,
        Name = result.Item["Name"].S,
        OtherAttributes = new Dictionary<string, string>()
    };

    foreach (var attribute in result.Item)
    {
        if (attribute.Key != "PK" && attribute.Key != "Name")
        {
            person.OtherAttributes.Add(attribute.Key, attribute.Value.S); // This code is handling only the case when attirubutes are on the top level and has string type. For more complex scenarios it should be extended additionally. 
        }
    }

Недостатком этого подхода является то, что вам нужно будет обрабатывать сопоставление самостоятельно и обрабатывать операцию сохранения таким же образом. ,Код трудно поддерживать, но его использование может быть применимо в случае небольшого количества свойств, которые вы обрабатываете (в вашем случае Id и Name).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...