0

InsertAllOnSubmit を使用して複数の挿入を実行しようとしていますが、テーブルに挿入されるアイテムは 1 つだけです。これが起こっていると私が考えることができる唯一の理由は、主キーフィールドの生成に関係していることです。現在、コードがこのフィールドを自動生成できるようにしていますが、そうではないようです。誰でも助けることができますか?

List<rewardsClaimed> lstRewardsClaimed = new List<rewardsClaimed>();

for (int i = 0; i < ticket.delivery.quantity; i++)
{
    rewardsClaimed claim = result;
    lstRewardsClaimed.Add(claim);
}
dc.rewardsClaimeds.InsertAllOnSubmit(lstRewardsClaimed);
dc.SubmitChanges();

編集 :

私は問題が何であるかを発見しました....IDフィールドはデフォルトで0に設定され、挿入が完了すると、すべての行が同じIDを持つため、それらは1行として扱われます。どうすればこれを防ぐことができますか?

4

4 に答える 4

2

問題は、List と Table の動作がまったく異なることです。

を使用するList<T>と、参照を確認せずに同じインスタンスを複数回追加できます。つまり、リスト内に同じオブジェクトへの複数の参照があります。

Table<T>一方、InsertAllOnsubmitメソッドを呼び出すと、コレクション内のすべてのアイテムがチェックされ、テーブルに挿入されるように既に「マーク」されているかどうかが確認されます。オブジェクトがすでに「マーク」されている場合は、スキップします。

コードで何が起こっているかというと、同じオブジェクトを n 回参照するクレームのリストを渡しているということです。が最初に渡されるとTable<T>、挿入のマークが付けられます。リスト内の他の項目は同じオブジェクトであるため、既に挿入用にマークされています。

これが明確になることを願っています。

于 2012-04-19T14:11:12.840 に答える
1

誰もがクラスRewardsClaimedの新しいインスタンスを作成するように求めています。しかし、それは正しい理由ではないと思いました。したがって、次のサンプルコードを試してみたところ、5つの異なるインスタンスがリストに追加されていることがわかりました。

パート1:新しいインスタンスを作成せずに同じアイテムをローカルリストに追加できることを示す(答えではありません)

コード: ここに画像の説明を入力してください

結果:

ここに画像の説明を入力してください

パート2:新しい主キーの作成が解決策になります。(これが問題と解決策です。)

PrimaryID列のデータが繰り返されていないことを確認することをお勧めします。つまり、主キーが自動的に生成されず、手動で生成された場合、同じ主キーを持つ行がn回取得される可能性があります。それが繰り返される場合、それはそれの単一のインスタンスのみを挿入します。

編集:フィールド値を自動生成する方法

主キーを自動生成する場合は、これを参照してください

于 2012-04-19T07:28:17.663 に答える
0

クレームの新しいインスタンスを作成していません。

rewardsClaimed claim = new rewardsClaimed();
于 2012-04-19T07:06:15.690 に答える
0
List<rewardsClaimed> lstRewardsClaimed = new List<rewardsClaimed>();

for (int i = 0; i < ticket.delivery.quantity; i++)
{
    rewardsClaimed claim = new rewardsClaimed();
    claim.property = result.property; // do this foreach property except id field
    lstRewardsClaimed.Add(claim);
}

dc.rewardsClaimeds.InsertAllOnSubmit(lstRewardsClaimed);

dc.SubmitChanges();
于 2012-04-19T07:09:13.943 に答える