2009-08-22 131 views
0

我在尝试从Windows Azure表存储下的表中选择一行时出现奇怪的错误。例外情况“已添加具有相同密钥的项目”。即使我没有插入任何东西,它正在被抛出。导致该问题的查询如下: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号和错误在循环的右上方抛出什么都没有改变。

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

+0

可以提供有关异常的更多信息,最显着的是它的类型? – Rik 2009-08-22 14:46:20

+0

与DataServiceContext一起使用HashSet是否存在问题? – Rik 2009-08-22 14:50:25

+0

在尝试获取p的行中引发异常。 – sean 2009-08-22 16:25:17

回答

0

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

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

这种科里森的可能原因是:

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

在这两种情况下,遇到它的上下文已经在跟踪不同的对象,但它们具有相同的键。这不是上下文本身可以理清的,因此也是例外。

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

+0

不,我检查了表格的内容。 RowKey是唯一的,因为我使用DateTime.UtcNow。而且我不会在桌子上添加任何东西。因此,奇怪的例外。 – sean 2009-08-22 12:18:35

+0

表中没有发生碰撞;它发生在上下文中。检查上下文的内容。 – Rik 2009-08-22 12:36:11

+0

什么都没有被修改,在ID中只有1个条目,它发生在顶部。 如果决定将RowKey留空并使用PartitionKey作为唯一标识符,现在... – sean 2009-08-22 14:01:49

相关问题