Windows Azure:“已添加具有相同密钥的项目。” Select上抛出的异常

时间:2009-08-22 11:57:20

标签: azure azure-storage

尝试从Windows Azure表存储下的表中选择一行时,我遇到了一个奇怪的错误。例外情况“已添加具有相同密钥的项目”。即使我没有插入任何东西也被抛出。导致问题的查询如下:

var ids = new HashSet<string>() { id };
var fields = new HashSet<string> {"@all"};
using (var db = new AzureDbFetcher())
{
     var result = db.GetPeople(ids, fields, null);
}

public Dictionary<string, Person> GetPeople(HashSet<String> ids, HashSet<String> fields,     CollectionOptions options)
{
    var result = new Dictionary<string, Person>();
    foreach (var id in ids)
    {
         var p = db.persons.Where(x => x.RowKey == id).SingleOrDefault();
         if (p == null)
         {
                continue;
         }
       // do something with result
    }
}

正如你所看到的,只有1个id,错误被抛到循环的顶部,没有任何东西被修改。

但是,我使用“”作为此特定行的分区键。是什么给了什么?

1 个答案:

答案 0 :(得分:0)

在执行此查询之前,您可能会向DataServiceContext添加一个具有相同行键(并且没有分区键)的对象。然后,您将从数据存储中检索冲突对象,并且由于冲突而无法将其添加到上下文中。

上下文跟踪从表中检索的所有对象。由于实体由其partitionKey / rowKey组合唯一标识,因此上下文(如表)不能包含重复的partitionkey / rowkey组合。

这种碰撞的可能原因是:

  • 检索实体,修改它,然后使用相同的上下文再次检索它。
  • 将实体添加到上下文,然后使用相同的键检索实体。

在这两种情况下,遇到它的上下文已经跟踪了一个不同的对象,但它具有相同的键。这不是上下文可以自行解决的问题,因此也是例外。

希望这会有所帮助。如果您可以提供更多信息,那将会有所帮助。