2009-08-20 8 views
1

Aknittel
これらのテーブル(tblSellerListingsおよびtblSellers)は、正式には外部キー関係と結合されていません(tblSellerListingsおよびtblSellers)。モデルやデータベースで、私は将来のために維持され、いくつかの参照整合性を求めています。私の問題が残っているので。なぜ私はこのコードで({「同じキーを持つ項目が既に追加されています。」})例外を得るのですか私は新しいのObjectContextでforeachループの各反復を開始し、私はパフォーマンスに影響を与えるだろうと思うのSaveChanges、とそれを終了しない場合ORCSolutionsDataService.tblSellerListings(ADO.NETののDataServices/WCFオブジェクトである理由、また、あなたは私に言うことができます??この例外はなぜ発生しますか? {})

エンティティへのLINQのようではないIDisposableを、=================== ===========================

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

}

+0

NewSellerListingの主キーとは何ですか?ところで、あなたは本当にあなたが直接あなたのクエリでそれを置くことができ、sellerIdを取得するための最初のforeachループを必要としません:NewSellerID =(s.SellerEBAYUserID == SellerUserIDがs.SellerIDを選択service.tblSellersで秒から)1次回( ); //もちろん、IDが見つからない場合は処理する必要がありますが、データベースの時間が節約されます。好奇心のうち – xandy

+0

、なぜあなたはqryCurrentSellerでのforeachのvar sのをやっているし、常にNewSellerIDへの再割り当て値。 NewSellerIDは最初のforeachの最後の反復を取るだけでしょうか? –

答えて

0

あなたは、古い値に基づいて新しいオブジェクトを作成するIDを指定して、DBに保存されているように見えますそれが本当であれば、。新しいオブジェクトは、コピー元のIDと同じIDを持ちます。更新中ですか、または新しいレコードを保存していますか?

同じことを達成する方法がもっと速いかもしれません。再割り当てまたはコピーされているIDのリストを取得するには、次のようなSQLを使用できます。

update tblSellerListings set SellerID = "new seller id" where ItemID in (list of ids); 
それは、クエリから次へとインクリメントIDの周りに維持されている場合

コンテキストを再使用することは問題になることがあります。新しい値を作成するとその値がクリアされます。私は、これが当てはまる場合、その価値をクリアする方法があると確信しています。

ヤコブ

関連する問題