2009-08-20 1 views
1

Aknettel
NewSellerID ist das Ergebnis einer Suche auf tblSellers.Diese Tabellen (tblSellerListings und tblSellers) sind auch nicht" offiziell "mit einer Fremdschlüsselbeziehung verknüpft im Modell oder in der Datenbank, aber ich möchte, dass einige referenzielle Integrität für die Zukunft beibehalten wird.so bleibt mein Problem.Warum bekomme ich die Ausnahme ({"Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt."}) mit diesem Code , wenn ich nicht jede Wiederholung der foreach-Schleife mit einem neuen ObjectContext beginne und sie mit SaveChanges beende, was sich auf die Performance auswirkt.Könnte man mir auch erklären, warum ORCSolutionsDataService.tblSellerListings (Ein ADO.NET DataServices/WCF-Objekt) ist nicht IDisposable, wie LINQ to Entities ??Warum bekomme ich diese Ausnahme? {Ein Element mit demselben Schlüssel wurde bereits hinzugefügt. "})

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

// 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 ("Es konnte kein neuer Fall hinzugefügt werden. Ausnahme: "+ ex.Message);

}

+0

Was ist der Primärschlüssel in NewSellerListing? BTW, du brauchst nicht wirklich die erste foreach-Schleife, um die sellerId zu bekommen, du kannst das direkt in deine Abfrage schreiben: NewSellerID = (von s in service.tblSellers wo s.SellerEBAYUserID == SellerUserID select s.SellerID) .First (); // Natürlich müssen Sie damit umgehen, wenn keine ID gefunden wird, aber dies spart Datenbankzeit. – xandy

+0

Aus Neugier, warum machst du eine foreach var s in QryCurrentSeller und ständig den Wert NewSellerID neu zuweisen. NewSellerID wird immer nur die letzte Iteration der ersten foreach nehmen ??? –

Antwort

0

Es sieht aus wie Sie ein neues Objekt auf der Grundlage der alten Werte zu schaffen, die ID-Angabe und speichern es in die DB Wenn das wahr ist, dann. Das neue Objekt wird dieselbe ID haben wie die, von der es kopiert wurde.Sie aktualisieren oder speichern einen neuen Datensatz?

Es sieht auch so aus, als könnte es einen viel schnelleren Weg geben, dasselbe zu erreichen Um die Liste der IDs zu erhalten, die neu zugewiesen oder kopiert werden, könnten Sie SQL verwenden, das dem folgenden ähnelt:

Die Wiederverwendung des Kontexts kann ein Problem darstellen, wenn die umlaufende ID von Abfrage zu Abfrage beibehalten wird. Das Erstellen eines neuen würde diesen Wert löschen. Ich wette, wenn das der Fall ist, dass es eine Methode gibt, die auch diesen Wert klarstellt.

Jacob

Verwandte Themen