Windows Azure: «Элемент с таким же ключом уже добавлен». исключение, выброшенное при выборе - PullRequest
0 голосов
/ 22 августа 2009

При попытке выбрать строку из таблицы в Windows Azure Table Storage появляется странная ошибка. Исключение «Элемент с таким же ключом уже добавлен». выбрасывается, хотя я ничего не вставляю. Запрос, который вызывает проблему, выглядит следующим образом:

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 идентификатор, и ошибка выдается прямо в верхней части цикла, и ничего не изменяется.

Однако я использую "" в качестве ключа раздела для этой конкретной строки. Что дает?

1 Ответ

0 голосов
/ 22 августа 2009

Возможно, вы добавили объект с тем же ключом строки (и без ключа раздела) в ваш DataServiceContext перед выполнением этого запроса. Затем вы извлекаете конфликтующий объект из хранилища данных, и его нельзя добавить в контекст из-за столкновения.

Контекст отслеживает все объекты, извлеченные из таблиц. Поскольку сущности однозначно идентифицируются по их комбинации partitionKey / rowKey, контекст, как и таблицы, не может содержать повторяющиеся комбинации ключ-раздел / строка-ключ.

Возможные причины такого столкновения:

  • Извлечение сущности, ее изменение, а затем повторное извлечение, используя тот же контекст.
  • Добавление объекта в контекст, а затем получение объекта с теми же ключами.

В обоих случаях контекст, с которым сталкивается, уже отслеживает другой объект, который, однако, имеет одинаковые ключи. Это не то, что контекст может разобраться сам по себе, отсюда и исключение.

Надеюсь, это поможет. Если бы вы могли дать немного больше информации, это было бы полезно.

...