Insert All仅插入最后一条记录? LINQ to SQL

时间:2016-11-20 09:41:39

标签: c# sql-server linq linq-to-sql

无论我尝试什么,我都无法让它发挥作用。

这是一个类似的问题InsertAllOnSubmit only inserts first data record,在我的情况下,它只插入最后一个记录集。

首先,我虽然未将主键设置为使用DateTime.UtcNow.Ticks更新ID列的手动设置。但是在更改SQL Server中的设置后,我能够手动设置主键。

我虽然这可以解决问题,但现在它更新主键,但只插入foreach循环中的最后一条记录。

我尝试删除Dbml并重新创建它,但这没有做任何事情。

这是我正在使用的代码,

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

就像列表在添加后只覆盖了List<T>

中的最后一个数据集

服务器端是否有需要更改的设置,还是其他设置?

2 个答案:

答案 0 :(得分:3)

Tenant_Bills_TBL addBill = new Tenant_Bills_TBL(); 

应该在foreach循环中。

问题中的代码实例化单个对象并在每次迭代时覆盖它的属性。

此外,不建议将DateTime.UtcNow.Ticks作为主键。您最好在机制中使用数据库自​​动增量buit(大多数数据库都有该选项)。正如你自己发现的那样,foreach循环对于每次迭代之间的滴答来说太快了,如果你甚至想到多线程插入,你可以清楚地看到即使在循环中使用Thread.Sleep也不够好。

答案 1 :(得分:1)

您获得此行为是因为您反复添加了相同的对象。正如评论所说 - 你应该在循环中移动新对象的实例化。 更好 - 你可以把它作为LINQ声明:

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