2009-08-20 6 views
1

Aknittel
NewSellerID est le résultat d'une recherche sur tblSellers Ces tables (tblSellerListings et tblSellers) ne sont pas "officiellement" jointes à une relation de clé étrangère, que ce soit dans le modèle ou dans la base de données, mais je veux une certaine intégrité référentielle maintenue pour l'avenir. donc, ma question demeure. Pourquoi est-ce que je reçois l'exception ({ « Un élément avec la même clé a déjà été ajouté. »}) avec ce code , si je ne commence pas chaque itération de la boucle foreach avec une nouvelle ObjectContext et terminer par SaveChanges que je pense affecte les performances. de plus, pourriez-vous me dire pourquoi ORCSolutionsDataService.tblSellerListings (un ADO.NET DataServices/objet WCF est pas IDisposable, comme LINQ à des entitésPourquoi ai-je cette exception? {Un élément avec la même clé a déjà été ajouté.}})

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

// 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(); 

}

catch (Exception ex) { MessageBox.Show ("Impossible d'ajouter un nouveau cas. Exception: "+ ex.Message);

}

+0

Quelle est la clé primaire dans NewSellerListing? BTW, vous ne vraiment pas besoin de la première boucle de foreach pour obtenir le SellerID, vous pouvez le mettre dans votre requête directement: NewSellerID = (de s dans service.tblSellers où s.SellerEBAYUserID == SellerUserID sélectionnez s.SellerID) .Premier () // Bien sûr, vous devez gérer si aucun ID n'est trouvé, mais cela économise l'heure de la base de données. – xandy

+0

Par curiosité, pourquoi faites-vous un foreach var s dans qryCurrentSeller et réassigner en permanence la valeur à NewSellerID. NewSellerID prendra seulement la dernière itération de la première foreach ??? –

Répondre

0

Il semble que vous créez un nouvel objet sur la base des anciennes valeurs, en spécifiant l'ID et enregistrer la DB Si cela est vrai, alors. le nouvel objet aura le même ID que celui à partir duquel il a été copié.Est-ce que vous mettez à jour, ou enregistrez un nouvel enregistrement?

Il semble aussi qu'il pourrait y avoir un moyen beaucoup plus rapide d'accomplir la même chose. obtenir la liste des ID qui sont réaffectés ou copiés, vous pouvez utiliser SQL semblable à:

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

La réutilisation du contexte peut poser un problème si elle conserve l'ID incrémenté de la requête à la suivante. En créer un nouveau effacerait cette valeur. Je parie que si c'est le cas, il y a une méthode qui va aussi effacer cette valeur.

Jacob

Questions connexes