【问题标题】:What does "Unable to find storage information for property" mean when using DynamoDB?使用 DynamoDB 时“无法找到属性的存储信息”是什么意思?
【发布时间】:2014-01-14 21:36:06
【问题描述】:

我正在使用适用于 AWS DynamoDB 的 .NET 开发工具包运行扫描。我正在这样做:

var result = context.Scan<Table>(new[] { new ScanCondition("AttributeName", ScanOperator.Equal, variable) }

这会引发异常

“无法找到属性 [AttributeName] 的存储信息”

AttributeName 属性是一个非索引属性,目前几乎没有任何值(这是我最近添加的一个新属性)。

我用谷歌搜索了这个错误,我想出的只是sdk source code,我可以深入研究,如果这里没有人能启发我,我会这样做。

【问题讨论】:

    标签: .net amazon-web-services amazon-dynamodb


    【解决方案1】:

    DynamoDBContext.Scan&lt;T&gt;() 方法只接受使用[DynamoDBTable()] 属性映射到该表的T 类的公共属性的名称。 Scan&lt;T&gt; 将无法识别表中未映射的属性。

    如果类T 没有该名称的public 属性,或者该属性被明确标记为[DynamoDBIgnore],则会引发该异常。

    如果需要扫描表中未建模的表属性,可以使用AmazonDynamoDBClient.Scan()提供的低级API,但不会返回T类型的对象。

    【讨论】:

    • 该属性已建模。它只是没有很多数据。我偷偷怀疑这是问题所在,因为低级 API 可以很好地扫描它。我认为高级 API 需要数据
    • 该错误是由检查模型的代码而非数据引发的,因此如果它是由数据的某些属性触发的,则会令人困惑。模型类是否可能已过时?它可能在不同的DLL中吗?项目需要在 VS 中清理/重建?
    • 不,都是最新的。试了干净,还是不行。
    • 你能提供你正在使用的建模类的完整代码吗?
    【解决方案2】:

    你的陈述是:

    var result = context.Scan<Table>(new[] { new ScanCondition("AttributeName", ScanOperator.Equal, variable) }
    

    根据 DynamoDB 文档,您需要传递“propertyName”代替“AttributeName”。

    DynamoDB 文档说:

    public ScanCondition(
    string propertyName,
    ScanOperator op,
    params Object[] values)
    

    参考:http://docs.aws.amazon.com/sdkfornet1/latest/apidocs/html/M_Amazon_DynamoDB_DataModel_ScanCondition__ctor.htm

    【讨论】:

      【解决方案3】:

      这也吸引了我,分享我的发现希望它可以帮助某人,我正在使用 C# 对象持久模型。

      DynamoDb 中的列名采用 Camel 大小写。 C# 类属性不是。

      [DynamoDBProperty("artist")]
          [DynamoDBHashKey]
          public string Artist { get; set; }
      
          [DynamoDBProperty("songTitle")]
          [DynamoDBRangeKey]
          public string SongTitle { get; set; }
          
      

      因此以下抛出错误,

      scanConditions.Add(new ScanCondition("songTitle", ScanOperator.BeginsWith, searchReq.SongTitle));
                  if (!string.IsNullOrEmpty(searchReq.Difficulty))
      

      修复,

      scanConditions.Add(new ScanCondition("SongTitle", ScanOperator.BeginsWith, searchReq.SongTitle));
                  if (!string.IsNullOrEmpty(searchReq.Difficulty))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        • 2019-09-13
        • 2019-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多