我正在尝试使用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行。我该怎样阻止这个?
答案 0 :(得分:2)
问题是List和Table的行为完全不同。
List<T>
允许您多次添加同一个实例而不检查列表中的引用,您对同一个对象有多个引用。
Table<T>
方法时, InsertAllOnsubmit
检查集合中的每个项目,看它是否已经“标记”以插入表中。如果已经“标记”的对象跳过它。
您的代码发生的事情是您将多次引用的声明列表传递给同一个对象。当传递给Table<T>
时,第一个事件被标记为插入。由于列表中的其他项目是同一个对象,因此它们已标记为要插入。
希望这澄清。
答案 1 :(得分:1)
每个人都要求创建RewardsClaimed类的新实例。但我认为这不是正确的理由。因此,我尝试了以下示例代码,发现列表中添加了5个不同的实例。
第1部分:显示可以将同一项目添加到本地列表而不创建新实例(不是答案)
<强>代码:强>
<强>结果:强>
第2部分:创建新的主键将是解决方案。(这是问题和解决方案。)
我建议,请检查您的PrimaryID列中的数据不会重复。我的意思是,如果您的主键没有自动生成并且您手动生成它,则可能会多次获得具有相同主键的行。如果它重复,那么它只会插入它的单个实例。
编辑:如何自动生成字段值
如果您想自动生成主键refer this。
答案 2 :(得分:0)
您没有创建新的声明实例。
rewardsClaimed claim = new rewardsClaimed();
答案 3 :(得分: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();