如何使用对象持久性模型动态更改C#中的dynamodb表名

sha*_*whu 6 c# amazon-dynamodb

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

DynamoDBTable("mydynamodbtablename")]
public class mytable
{
  ....
}
Run Code Online (Sandbox Code Playgroud)

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

var Table_Name = Config.GetTableName();
DynamoDBTable(Table_Name)]
public class mytable
{
  ....
}
Run Code Online (Sandbox Code Playgroud)

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

有没有一种方法(简便方法),以便我仍然可以使用DDB对象持久性模型并使表名称动态化?

更新:

似乎我没有明确提到ddb持久性模型。这是官方文档 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/CRUDHighLevelExample1.html

这是一个在实际实践中我们如何使用对象持久性模型的示例

var records = await context.LoadAsync<mytable>(somekey);
foreach(var item in records)
{
   ....
}
Run Code Online (Sandbox Code Playgroud)

小智 8

使用LoadAsync<T>接受a 的方法的重载DynamoDBOperationConfig

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


Esb*_*sen 6

如果您想对整个应用程序执行此操作(我猜是这样,因为您提到了配置文件),您应该使用 DynamocDBContext 的重载,它采用 DynamoDBContextConfig。例如在 dotnet core 中你会这样做:

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


not*_*est 2

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

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

public Table LoadTable(
         IAmazonDynamoDB ddbClient,
         TableConfig config
)
Run Code Online (Sandbox Code Playgroud)

API 接受该TableConfig参数。该类TableConfig具有覆盖表名称的方法。

Amazon.DynamoDBv2.DocumentModel.TableConfig 
TableName
Run Code Online (Sandbox Code Playgroud)

例子:-

您可以设置tableNameon tableConfig 对象。

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