无论我尝试什么,我都无法让它发挥作用。
这是一个类似的问题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>
服务器端是否有需要更改的设置,还是其他设置?
答案 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);