2009-08-22 13 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つだけのIDがありますとエラーがループの先頭で右投げられると、何も変更されていません。

しかし、私はこの特定の行のパーティションキーとして ""を使用しています。何がありますか?

+0

例外についての情報、とりわけその型を教えてください。 – Rik

+0

DataServiceContextを持つHas​​hSet oに問題がありますか? – Rik

+0

pを取得しようとしている行で例外がスローされました。 – sean

答えて

0

このクエリを実行する前にDataServiceContextに同じ行キー(パーティションキーなし)を追加したオブジェクトがおそらくあります。次に、競合するオブジェクトをデータストアから取得しています。衝突のためにコンテキストに追加することはできません。

コンテキストは、テーブルから取得したすべてのオブジェクトを追跡します。エンティティはpartitionKey/rowKeyの組み合わせによって一意に識別されるため、テーブルのようなコンテキストには重複するパーティションキーとローキーの組み合わせを含めることはできません。そのようなコリソンの

考えられる原因は次のとおり

  • は、エンティティの取得、それを修正し、同じコンテキストを使用して再度検索します。
  • コンテキストにエンティティを追加し、同じキーでエンティティを取得します。

どちらの場合でも、同じキーを持っている別のオブジェクトをトラッキングしているコンテキストが検出されます。これは、コンテキストがそれ自体でソートできるものではないため、例外です。

これが役に立ちます。もう少し情報を与えることができれば、それは役に立ちます。

+0

いいえ、私はテーブルの内容をチェックしました。 RowKeyは、私がDateTime.UtcNowを使用するのでユニークです。私はテーブルに何も追加していません。したがって、奇妙な例外です。 – sean

+0

テーブル内で衝突が発生していません。それは文脈で起こっている。コンテキストの内容を確認してください。 – Rik

+0

何も変更されていません.IDには1つのエントリしかありません。 RowKeyを空のままにして、一意の識別子としてPartitionKeyを使用することに決めた場合... – sean

関連する問題