1

我有模特

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]属性,所以我正在寻找类似的行为。

4

1 回答 1

0

不幸的是,我不相信通过 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 和名称)。

于 2019-10-11T15:45:18.507 回答