InsertAllOnSubmit只插入一个项目

时间:2012-04-19 07:02:05

标签: c# linq-to-sql

我正在尝试使用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 个答案:

答案 0 :(得分:2)

问题是List和Table的行为完全不同。

List<T>允许您多次添加同一个实例而不检查列表中的引用,您对同一个对象有多个引用。

另一方面,当您调用Table<T>方法时,

InsertAllOnsubmit检查集合中的每个项目,看它是否已经“标记”以插入表中。如果已经“标记”的对象跳过它。

您的代码发生的事情是您将多次引用的声明列表传递给同一个对象。当传递给Table<T>时,第一个事件被标记为插入。由于列表中的其他项目是同一个对象,因此它们已标记为要插入。

希望这澄清。

答案 1 :(得分:1)

每个人都要求创建RewardsClaimed类的新实例。但我认为这不是正确的理由。因此,我尝试了以下示例代码,发现列表中添加了5个不同的实例。

第1部分:显示可以将同一项目添加到本地列表而不创建新实例(不是答案)

<强>代码: enter image description here

<强>结果:

enter image description here

第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();