如何使用对象持久化模型在C#中动态更改DynamoDB表名

10

我正在使用dynamodb的对象持久化模型。

DynamoDBTable("mydynamodbtablename")]
public class mytable
{
  ....
}

问题是,如果我尝试在运行时动态更改表的名称(我通过配置文件获得表名),就会出现错误。

var Table_Name = Config.GetTableName();
DynamoDBTable(Table_Name)]
public class mytable
{
  ....
}

错误:属性参数必须是常量表达式、typeof表达式或者数组创建表达式,类型为xxx的属性参数

是否有(简单的)方法可以在仍然使用DDB对象持久化模型的情况下使表名变成动态的?

更新:

看起来我没有清楚地提到ddb持久化模型。这里是官方文档 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/CRUDHighLevelExample1.html

以下是一个现实实践中如何使用对象持久化模型的示例

var records = await context.LoadAsync<mytable>(somekey);
foreach(var item in records)
{
   ....
}
3个回答

24

使用接受 DynamoDBOperationConfigLoadAsync<T> 方法的重载:

var config = new DynamoDBOperationConfig 
{ 
    OverrideTableName = "MyTableName"
};
var records = await context.LoadAsync<mytable>(somekey, config);
foreach(var item in records)
{
   ....
}

5

如果您想针对整个应用程序执行此操作(我猜这是情况,因为您提到了配置文件),您应该使用带有DynamoDBContextConfig参数的DynamocDBContext重载。例如,在dotnet core中,您可以执行以下操作:

services.AddTransient<IDynamoDBContext>(c => new 
DynamoDBContext(c.GetService<IAmazonDynamoDB>(),
                new DynamoDBContextConfig 
                { 
                    TableNamePrefix = Configuration.GetValue("MyEnvironment", "unspecified")  + "-" 
                }));

2

文档模型的主要类是TableDocumentTable类具有执行数据库操作(PutItem、GetItem、DeleteItem)的不同API。

使用LoadTable API加载表时,可以设置TableConfig以覆盖表名值。

public Table LoadTable(
         IAmazonDynamoDB ddbClient,
         TableConfig config
)

API接受TableConfig参数。 TableConfig类具有覆盖表名的方法。
Amazon.DynamoDBv2.DocumentModel.TableConfig 
TableName

例子:

您可以在tableConfig对象上设置tableName

// Set up the Table object
var tableConfig = new TableConfig("tableName");
Table table = Table.LoadTable(client, tableConfig);
Document document = table.GetItem(101); // Primary key 101.

1
谢谢,但这是文档模型。我理解以下所有事实:1)表类定义是文档模型的一部分,即使被对象持久化模型使用。2)我们可以使用文档模型来实现这一点。问题是,我如何使用持久化模型?我们大多数代码都是使用持久化模型编写的。谢谢! - shawhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接