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

Posted

技术标签:

【中文标题】Windows Azure:“已添加具有相同密钥的项目。”选择时抛出异常【英文标题】:Windows Azure: "An item with the same key has already been added." exception thrown on Select 【发布时间】:2010-11-21 21:32:06 【问题描述】:

我在尝试从 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,错误在循环顶部抛出,没有任何内容被修改。

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

【问题讨论】:

能否提供有关异常的更多信息,尤其是其类型? DataServiceContext 的HashSet o 有问题吗? 试图获取 p 的行抛出异常。 【参考方案1】:

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

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

这种碰撞的可能原因是:

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

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

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

【讨论】:

不,我检查了表格的内容。 RowKey 是独一无二的,因为我使用的是 DateTime.UtcNow。而且我不会在表格中添加任何内容。因此,奇怪的例外。 表中没有发生碰撞;它发生在上下文中。检查上下文的内容。 什么都没有被修改,ids 中只有 1 个条目,它发生在顶部。如果决定现在将 RowKey 留空并使用 PartitionKey 作为唯一标识符... 好像解决了问题.....还有一点需要注意的是,之前我使用的partitionKey要么是空字符串,要么是单个字符,rowkey始终是utcTime。现在 partitionKey 是 utcTime 并且 RowKey 始终为空。

以上是关于Windows Azure:“已添加具有相同密钥的项目。”选择时抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

GET 调用:已添加具有相同密钥的项目。键:标识

Ionic.Zip ArgumentException(已添加具有相同密钥的项目)

IStatefulServiceReplica.Open 上的错误 - 已添加具有相同密钥的项目

protobuf-net 出现“已添加具有相同密钥的项目”错误

已添加具有相同密钥的项目 C# -Ionic.Zip

当我转到共享服务管理中的“搜索设置”页面时,出现此错误:“已添加具有相同密钥的项目。”