如何在LINQ to SQL中一次插入多个记录,同时在每个插入上调用序列检索功能

| 我正在尝试将多个记录插入到表中,其中每个记录的序列号都依赖于先前插入的记录的序列号。 例如:
var db = new StoreDataContext();
var inserts = payments.Select(p => new payment 
{
    order_fk = p.order_fk, line_no = DbMethods.GetNextLine(p.order_fk), 
    amount = p.amount
});

db.payments.InsertAllOnSubmit(inserts);
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
DbMethods.GetNextLine是一个SQL标量函数,可以获取该特定顺序的
MAX(line_no) + 1
。 我的问题是该函数是在实际插入发生之前执行的,因此line_no的所有值都相同。有没有这样做而不分开提交每个记录?     
已邀请:
        我知道用Linq to SQL做这样的事情的唯一方法是将其包装在事务中。
var db = new StoreDataContext();
using(var scope = new TransactionScope()){        
    foreach(var p in payments){
        db.payments.Insert(new payment 
                          {    order_fk = p.order_fk, 
                               line_no = DbMethods.GetNextLine(p.order_fk),     
                                amount = p.amount
                          });
        db.SubmitChanges(ConflictMode.FailOnFirstConflict);
    }
    scope.Complete();
}
    
        尝试这个
var db = new StoreDataContext();
Int32 lineNo = DbMethods.GetNextLine(p.order_fk);
var inserts = payments.Select(p => new payment 
{
  order_fk = p.order_fk,
  amount = p.amount
});
foreach(var item on inserts)
{
  item.line_no = LineNo;
  LineNo++;
}
db.payments.InsertAllOnSubmit(inserts);
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
    
        解决此问题的最简单(也可能是最可靠)的方法是利用数据库。例如,您可以创建一个触发器,在插入付款时设置行号。这样,即使您使用其他方式在此表中输入付款,数据也将保持一致。 但是,如果不允许您修改架构,则下一个最佳方法可能是将要插入的付款按ѭ4分组,然后在尝试执行插入操作之前适当地对它们进行递增。您应该能够使用事务作用域来确保原子性,但是如果您经常这样做,它将大大降低速度。     

要回复问题请先登录注册