Сущность с такой же идентичностью уже существует в этом EntitySet. - WCF RIA Services - PullRequest
0 голосов
/ 23 октября 2011

У меня есть следующий код, который, как я ожидаю, проверит, существует ли сущность, и, если нет, добавит ее в коллекцию.Затем я призываю отправить изменения в контекст, чтобы сохранить изменения.

int kwID = (int)(from d in this._keywordSource.Source where d.keyword.ToLower() == searchText.ToLower() select d.keywordID).FirstOrDefault();
if ( null == this._context.Rules.Where(e => e.keywordID == kwID && e.searchTerm == item.SearchTerm).FirstOrDefault())
    {
        this._context.Rules.Add(new Rule() { keywordID = kwID, searchTerm = item.SearchTerm, processed = false });
    }

Я проверяю это с помощью 3 ключевых слов / комбинаций searchTerm:

Apple / Apple

iPad /iPad

iPod / iPod

При первой попытке никогда не запускается .Добавить строку кода.Второй делает, успешно.Третий выдает ошибку An entity with the same identity already exists in this EntitySet..

Я читал, что это как-то связано с тождеством и семенем, особенно если ваше семя равно 0 в БД.Мой не (установлен в 1).В самом EntitySet содержится ~ 1900 предметов.

Что мне здесь не хватает?

[EDIT] Добавлен код kwID, ​​чтобы показать, что ключевое слово в конечном итоге является kwID в условном выражении.

Первичным ключом этой таблицы является ruleID.Это то, что, по моему мнению, нарушается в сообщении об ошибке ... но я не знаю, как и почему.

1 Ответ

0 голосов
/ 23 октября 2011

ИМХО, неправильное состояние.Пример: у вас есть в базе данных:

  • KWid: 5, SearchTerm: iPod
  • KWid: 6, SearchTerm: iPad

И ввы ставите значения

  • KWid: 5, SearchTearm: GooglePhone

this._context.Rules.Where(e => e.keywordID == 5 && e.searchTerm == "GooglePhone").FirstOrDefault() возвращает значение NULL, поэтому вы пытаетесь добавить строку с существующим KWid.

Решение: Изменить && условие на ||

if ( null == this._context.Rules.Where(e => e.keywordID == kwID || e.searchTerm == item.SearchTerm).FirstOrDefault())
...