2016-11-20 7 views
0

私は何を試しても、これを動作させることはできません。Insert Allは最後のレコードのみを挿入しますか? LINQ to SQL

これは私の場合は最後のレコードセットのみを挿入するのと同じ質問です。InsertAllOnSubmit only inserts first data record

ID列を更新するために、プライマリキーがDateTime.UtcNow.Ticksを使用して手動設定として設定されていませんでした。しかし、SQL Serverの設定を変更した後は、手動でプライマリキーを設定することができました。

これで問題は解決しますが、現在はプライマリキーが更新されますが、最後のレコードはforeachループに挿入されます。

私はDbmlを削除して再作成しようとしましたが、何もしませんでした。

これはリストだけList<T>

で最後のデータセットを残して追加された後の値を上書きされることは、サーバー上の設定があるようですが、

List<Tenant_Bills_TBL> addNewData = new List<Tenant_Bills_TBL>(); 
     Tenant_Bills_TBL addBill = new Tenant_Bills_TBL(); 
     var recordsForTenant = Database.GetBillsRecordsForTenant(Database.DataContext, SelectedTenant.Code); 
     foreach (var item in recordsForTenant) 
      { 
       addBill.ID = DateTime.UtcNow.Ticks; 
       addBill.Tenant_Code = SelectedTenant.Code; 
       addBill.Year_Data = DateFilter.Year; 
       addBill.Month_Data = DateFilter.Month; 
       addBill.Tenant_Bill = item.Tenant_Bill; 
       addBill.Bill_Amount = item.Bill_Amount; 
       addBill.Bill_Quantity = item.Bill_Quantity;        
       addNewData.Add(addBill);        
      } 
Database.DataContext.Tenant_Bills_TBLs.InsertAllOnSubmit(addNewData); 
Database.DataContext.SubmitChanges(); 

私が使用していたコードです私が変える必要がある側か、それとも何か他の人ですか?

+1

この行 'Tenant_Bills_TBL addBill = new Tenant_Bills_TBL();'は 'foreach'ループ内にある必要があります。 –

+0

@ZoharPeledありがとう、それはトリックでした。あなたがそれを答えにしたいなら、私はUVとマークを解決します。乾杯。ところで、 'foreach'が速く動いて、同じ主キー値を作成していたので、DateTimeティックをインクリメントする必要がありました。 – KyloRen

答えて

3

行。

質問内のコードは、単一のオブジェクトをインスタンス化し、すべての反復でプロパティをオーバーライドします。

また、DateTime.UtcNow.Ticksをプライマリキーとして使用することはお勧めしません。メカニズムでは、データベースの自動インクリメント・バイトを使用してください(ほとんどのデータベースにはオプションがあります)。自分で見つけたように、foreachループは、各反復の間でティックが変化するのは速すぎるだけです。マルチスレッドの挿入を考えていても、ループ内にThread.Sleepがあっても十分ではありません。

+0

私は何度か愚かなことがあるとは信じられません。再度、感謝します。 – KyloRen

+0

簡単な間違いを見落としても、誰かが愚かになることはありません。私たち全員が時々それをする。 –

1

同じオブジェクトを繰り返し追加したため、この現象が発生しています。コメントによると、ループ内で新しいオブジェクトのインスタンス化を移動する必要があります。 さらに良い - あなたはそれをLINQ文を作ることができます。

Tenant_Bills_TBL addBill = new Tenant_Bills_TBL(); 

は、foreachループ内にある必要があります

var newData = Database 
      .GetBillsRecordsForTenant(Database.DataContext, SelectedTenant.Code) 
      .Select(item => new Tenant_Bills_TBL{ 
       ID = DateTime.UtcNow.Ticks; 
       Tenant_Code = SelectedTenant.Code; 
       Year_Data = DateFilter.Year; 
       Month_Data = DateFilter.Month; 
       Tenant_Bill = item.Tenant_Bill; 
       Bill_Amount = item.Bill_Amount; 
       Bill_Quantity = item.Bill_Quantity;           
       }) 
      .ToList(); 
    Database.DataContext.Tenant_Bills_TBLs.InsertAllOnSubmit(addNewData); 
関連する問題