Должен ли context.SaveChanges () вызываться после добавления всех объектов в контекст? - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в EF 4.1, я пытаюсь добавить список объектов в таблицу sql, используя первый подход EF и DB.

1) Должен ли я вызывать context.SaveChanges () внутри для цикла после AddObject(Trans) или его можно назвать вне цикла?

2) Кроме того, будут ли отменены все транзакции в случае ошибки?Я читал, что Entity Framework уже поддерживает собственные транзакции базы данных. Если какой-либо грязный объект ObjectStateEntry не может быть сохранен, то ObjectContext.SaveChanges откатит транзакцию и выдаст исключение.

3) Что еще можно сделать для увеличения производительности?Я вставлю около 1200 записей за один раз.

try
{
    using (TransactionModel context = new TransactionModel())
    {
        try
        {
            foreach (var item in lstUnAllocatedTransaction)
            {
                Transaction Trans = new Transaction();

                Trans.Amount = item.Amount;
                Trans.Date = Datetime.Now;
                Trans.DateAllocated = null;

                context.Transactions.AddObject(Trans);
            }
            context.SaveChanges();
        }
        catch (Exception ex)
        {
        }
    }
}
catch (Exception ex)
{
}
}

1 Ответ

0 голосов
/ 08 октября 2018

1) Должен ли я вызывать context.SaveChanges () внутри цикла for после AddObject (Trans) или нормально вызывать его вне цикла?

Это нормально (и предпочтительно)вызывать вне цикла, если все в порядке, что все операции добавления являются одной транзакцией.Если вам требуется одна транзакция для каждого элемента, то, очевидно, вам нужно вызывать ее внутри цикла.

2) Кроме того, все транзакции будут откатываться в случае ошибки?Я прочитал, что Entity Framework уже поддерживает собственные транзакции базы данных. Если какой-либо грязный объект ObjectStateEntry не может быть сохранен, то ObjectContext.SaveChanges откатит транзакцию и выдаст исключение.

Только последняя транзакция будетоткат.Вот почему 1) имеет значение.Если вы хотите вставить all-or-none, вам нужно добавить all и затем вызвать SaveChanges один раз.

3) Что еще можно сделать, чтобы увеличить производительность?Я вставлю около 1200 записей за один раз.

Вы можете позвонить AddRange вместо Add, иначе у меня никогда не было проблем с небольшим количеством записей.Если вы думаете, что это слишком медленно, посмотрите на объемные вставки.В EF нет ничего встроенного, для этого вам понадобится расширение.

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