将所有对象添加到上下文后,是否应该调用context.SaveChanges()?

时间:2018-10-08 14:51:42

标签: c# .net entity-framework

我是EF 4.1的新手,我试图使用EF和DB First方法将对象列表添加到sql表中。

1)我应该在AddObject(Trans)之后在for循环内调用context.SaveChanges()还是可以在循环外调用它?

2)另外,如果发生错误,是否将所有事务回滚? 我已经读过实体框架已经支持本机数据库事务,如果无法持久保存任何脏的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 :(得分:1)

  

1)我应该在AddObject(Trans)之后在for循环内调用context.SaveChanges()还是可以在循环外调用它?

如果整个添加操作都是一个事务,则可以在循环外调用(并且更好)。如果您需要每一项交易,那么显然您需要在循环中调用它。

  

2)另外,如果发生错误,是否将所有事务回滚?我已经读过实体框架已经支持本机数据库事务,如果无法持久保存任何脏的ObjectStateEntry对象,则ObjectContext.SaveChanges将回滚该事务并引发异常。

只有最后一笔交易将被回滚。这就是为什么1)有所作为。如果要插入全或无,则需要全部添加,然后调用一次SaveChanges

  

3)还有什么可以做以提高性能?我将一口气插入大约1200条记录。

您可以致电AddRange而不是Add,否则我很少遇到记录少的问题。如果您认为它太慢,请查看大量插入内容。 EF没有内置功能可以执行此操作,您将需要扩展。