【问题标题】:Should context.SaveChanges() be called after adding all objects to context?将所有对象添加到上下文后是否应该调用 context.SaveChanges()?
【发布时间】:2018-10-08 14:51:41
【问题描述】:

我是 EF 4.1 的新手,我正在尝试使用 EF 和 DB 优先方法将对象列表添加到 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)
{
}
}

【问题讨论】:

  • 那么您示例中的Transaction 是业务对象,而不是数据库事务?
  • 不幸的是,EF 不支持所有批量操作。
  • Transaction 是一个实体,由 EF 自动生成的类(自定义工具)
  • 我确实研究了批量操作选项,但不确定在一次添加 1.2k 或 1.4k 行时是否会注意到任何差异。我需要测试一下。

标签: c# .net entity-framework


【解决方案1】:

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

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

2) 另外,如果出现错误,所有事务都会回滚吗?我看过Entity Framework已经支持原生数据库事务,如果有脏的ObjectStateEntry对象不能持久化,那么ObjectContext.SaveChanges会回滚事务并抛出异常。

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

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

你可以打电话给AddRange而不是Add,否则我从来没有遇到过少量记录的问题。如果您认为它太慢,请查看批量插入。 EF 没有任何内置功能可以做到这一点,您需要扩展。

【讨论】:

  • 在 EF 4.1 中可以使用 AddRange 吗?
  • @user1263981 哇哦,4.1 太古老了……我不知道。你有问题吗?
  • 无法使用更高版本,因为当前应用程序是 4.1 版。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 2023-01-10
  • 1970-01-01
相关资源
最近更新 更多