C# 使用IAmazonDynamoDB或IDynamoDBContext(两者都有?)

C# 使用IAmazonDynamoDB或IDynamoDBContext(两者都有?),c#,amazon-web-services,amazon-dynamodb,amazon-cloudformation,aws-sdk-net,C#,Amazon Web Services,Amazon Dynamodb,Amazon Cloudformation,Aws Sdk Net,我从AWS SDK模板开始了我的Visual Studio项目。它在函数中使用IDynamoDBContext,在测试中使用IAmazonDynamoDB。 当我收到带有id(散列)的文档时,一切都在保存和接收文档。但当我把一个范围添加到我的表中时,它停止了工作。我所有的测试都是针对AWS dynamoDb的。但我有两种方法让它起作用。第一种方法是下载dynamoDb的本地实例。第二次是在我的函数中将IDynamoDBContext替换为IAmazonDynamoDB时(因此它在函数和测试类中使

我从AWS SDK模板开始了我的Visual Studio项目。它在函数中使用IDynamoDBContext,在测试中使用IAmazonDynamoDB。 当我收到带有id(散列)的文档时,一切都在保存和接收文档。但当我把一个范围添加到我的表中时,它停止了工作。我所有的测试都是针对AWS dynamoDb的。但我有两种方法让它起作用。第一种方法是下载dynamoDb的本地实例。第二次是在我的函数中将IDynamoDBContext替换为IAmazonDynamoDB时(因此它在函数和测试类中使用了相同的接口)。我不知道正确的解决方案是什么,但为什么要首先使用2个接口?我应该继续挖掘为什么它不能与不同的接口一起工作,还是应该只使用其中一个接口

        // IDynamoDBContext (default) - Didn't save my item (did save it in local DynamoDB)
        var test = new Test
        {
            UserId = "Test",
            Id = 1
        };

        await DDBContext.SaveAsync<Test>(test);

        // IAmazonDynamoDB - Did save my item
        var putItemRequest = new PutItemRequest
        {
            TableName = "TestTable",
            Item = new Dictionary<string, AttributeValue>()
            {
                { "UserId", new AttributeValue { S = "Test" }},
                { "Id", new AttributeValue { N = "1" }}
            }
        };
        await DDBContext.PutItemAsync(putItemRequest);
//IDynamoDBContext(默认)-未保存我的项目(已将其保存在本地DynamoDB中)
var测试=新测试
{
UserId=“Test”,
Id=1
};
等待DDBContext.SaveAsync(测试);
//IAmazonDynamoDB-是否保存了我的项目
var putItemRequest=新的putItemRequest
{
TableName=“TestTable”,
Item=新字典()
{
{“UserId”,新属性值{S=“Test”},
{“Id”,新属性值{N=“1”}
}
};
等待DDBContext.PutItemAsync(putItemRequest);
我的测试:

            var item = new GetItemRequest
        {
            TableName = "TestTable",
            Key = new Dictionary<string, AttributeValue>
            {
                { "UserId", new AttributeValue { S = "Test" } },
                { "Id", new AttributeValue { N = "1" } },
            },
        };
        Assert.True((await this.DDBClient.GetItemAsync(item)).Item.Count > 0);
var item=new GetItemRequest
{
TableName=“TestTable”,
关键字=新字典
{
{“UserId”,新属性值{S=“Test”},
{“Id”,新属性值{N=“1”},
},
};
Assert.True((等待此.DDBClient.GetItemAsync(item)).item.Count>0);

我们可能需要AWS.Net SDK团队中的某个人对此发表意见,但以下是我的最佳见解

Amazon文档总是很有趣

文档没有说得太清楚,但是IDynamoDBContext可以在
Amazon.DynamoDbv2.DataModel
名称空间中找到,该名称空间用于对象持久性数据访问

因此我认为,IAmazonDynamoDB接口用于针对DynamoDB服务的常规API调用。这两种模式具有重叠的功能,它们都可以处理dynamoDb表中的给定项

当然,文档非常清楚,因为它说,IDynamoDbContext

用于使用DynamoDB的数据模型模式的上下文接口。曾经 与服务交互、保存/加载对象等

对于IAmazonDynamoDB它说

用于访问DynamoDB Amazon DynamoDB的接口

IAmazonDynamoDB来自
Amazon.DynamoDbv2
命名空间,而IDynamoDBContext位于
Amazon.DynamoDbv2.DataModel

如果您查看这两种方法的文档,您会发现,通过查看这些方法,每种操作的性能都非常不同

您可以通过以下方式与DynamoDb进行更多互动和工作:

  • 创建表
  • 删除表
  • 创建全局索引和备份
  • 等等
您仍然可以直接处理项,但API调用的数量 通过此界面提供的功能更大,允许使用 整个DynamoDB服务

使用以下方法直接处理给定DynamoDb表中的项:

  • 拯救
  • 质疑
  • 扫描
  • 装载

一致性始终是编程中的关键,因此,对于需要执行相同级别工作的区域,始终使用相同的接口。因此,您的代码和测试应该使用相同的接口,因为它们专注于相同的工作范围。希望基于这个额外的澄清,你知道你想要什么接口。如果您的代码所要做的只是处理DynamoDb表中的项,那么IDynamoDBContext可能就是您想要的

您是否使用Sort Key属性[DynamoDBRangeKey]更新了测试类(与表匹配的C#对象)?比如这个例子:@AbhayaChauhan是的,我有这个属性。我将使用IDynamoDBContext,正如您在我的函数和测试类中所说的。我仍然会保留我的IAmazonDynamoDB来构建我的表,然后像这样创建我的IDynamoDBContext:new DynamoDBContext(ddbClient,new DynamoDBContextConfig{Conversion=DynamoDBEntryConversion.V2});但是,当我对AWS使用“LoadAsync”时,我没有得到任何项目(只有当我使用本地DynamoDB时)。当我对AWS进行测试时,这可能与我所在的地区有关吗?var ddbClient=新的AmazondynamodClient(RegionEndpoint.EUWest1);鉴于目前的信息,很难说,因为这是一种有争议的变化。我不知道你的AWS设置是什么。我假设您已经验证了DynamoDb表在EUWest1区域中具有相同的数据?您是否收到错误或任何信息?您可以在web UI中使用相同的查询并获取数据吗?也许用这些细节来回答另一个问题最简单。你的权利。我又问了一个问题,