Почему я получаю это исключение? {Элемент с таким же ключом уже добавлен. "}) - PullRequest
1 голос
/ 20 августа 2009

Aknittel
NewSellerID является результатом поиска в tblSellers. Эти таблицы (tblSellerListings и tblSellers) не «официально» связаны с отношением внешнего ключа, ни в модели, ни в базе данных, но я хочу сохранить некоторую ссылочную целостность на будущее. Так что моя проблема остается. Почему я получаю исключение ({"Элемент с тем же ключом уже был добавлен."}) С этим кодом, если я не начинаю каждую итерацию цикла foreach с нового ObjectContext и заканчиваю его с помощью SaveChanges, который Я думаю, повлияет на производительность. Кроме того, не могли бы вы сказать мне, почему ORCSolutionsDataService.tblSellerListings (объект ADO.NET DataServices / WCF не IDisposable, как LINQ to Entities ??

==============================================

// Add listings to previous seller
int NewSellerID = 0;

// Look up existing Seller key using SellerUniqueEBAYID
var qryCurrentSeller = from s in service.tblSellers
                       where s.SellerEBAYUserID == SellerUserID
                       select s;

foreach (var s in qryCurrentSeller)
    NewSellerID = s.SellerID;

// Save the selected listings for this seller

foreach (DataGridViewRow dgr in dgvRows)
{

    ORCSolutionsDataService.tblSellerListings NewSellerListing = new ORCSolutionsDataService.tblSellerListings();
    NewSellerListing.ItemID = dgr.Cells["txtSellerItemID"].Value.ToString();
    NewSellerListing.Title = dgr.Cells["txtSellerItemTitle"].Value.ToString();
    NewSellerListing.CurrentPrice = Convert.ToDecimal(dgr.Cells["txtSellerItemPrice"].Value);
    NewSellerListing.QuantitySold = Convert.ToInt32(dgr.Cells["txtSellerItemSold"].Value);
    NewSellerListing.EndTime = Convert.ToDateTime(dgr.Cells["txtSellerItemEnds"].Value);
    NewSellerListing.CategoryName = dgr.Cells["txtSellerItemCategory"].Value.ToString();
    NewSellerListing.ExtendedPrice = Convert.ToDecimal(dgr.Cells["txtExtendedReceipts"].Value);
    NewSellerListing.RetrievedDtime = Convert.ToDateTime(dtSellerDataRetrieved.ToString());
    NewSellerListing.SellerID = NewSellerID;

    service.AddTotblSellerListings(NewSellerListing);

}

service.SaveChanges();

}

поймать (исключение ex) { MessageBox.Show ("Невозможно добавить новый случай. Исключение:" + ex.Message);

}

1 Ответ

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

Похоже, вы создаете новый объект на основе старых значений, определяете идентификатор и сохраняете его в БД. Если это так, то у нового объекта будет тот же идентификатор, что и у того, с которого он был скопирован. Вы обновляете или сохраняете новую запись?

Похоже, что может быть гораздо более быстрый способ сделать то же самое. Если вы можете получить список идентификаторов, которые переназначаются или копируются, вы можете использовать SQL, подобный следующему:

update tblSellerListings set SellerID = "new seller id" where ItemID in (list of ids);

Повторное использование контекста может быть проблемой, если он хранится вокруг возрастающего идентификатора от запроса к следующему. Создание нового очистило бы это значение. Могу поспорить, что в этом случае есть метод, который также очищает это значение.

Jacob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...