Как вставить несколько записей одновременно в LINQ to SQL при вызове функции поиска последовательности при каждой вставке - PullRequest
2 голосов
/ 16 июня 2011

Я пытаюсь вставить несколько записей в таблицу, где каждая запись имеет порядковый номер, который основан на порядковом номере ранее вставленной записи.

Например:

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 являютсятак же.Есть ли способ сделать это без отдельной отправки каждой записи?

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

попробуйте

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);
2 голосов
/ 16 июня 2011

Единственный способ, которым я знаю, чтобы сделать что-то подобное с 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();
}
1 голос
/ 16 июня 2011

Самый простой (и, вероятно, самый надежный) способ обойти это - использовать базу данных.Например, вы можете создать триггер, который устанавливает номер строки при каждом внесении платежа.Таким образом, данные остаются согласованными, даже если вы используете другие способы ввода платежей в эту таблицу.

Однако, если вам не разрешено изменять схему, следующим наилучшим способом, вероятно, будет группировкаплатежи, которые вы собираетесь вставить, на order_fk, а затем увеличивайте их соответствующим образом, прежде чем пытаться выполнить вставку.Вы должны иметь возможность использовать область транзакций для обеспечения атомарности, но если вы будете делать это очень часто, это немного замедлит процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...