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



我是EF 4.1的新手,我正在尝试使用EF和DB优先方法将对象列表添加到sql表中。

1(我应该调用上下文吗?在 AddObject(Trans( 之后将 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(我应该调用上下文吗?在 AddObject(Trans( 之后将 SaveChanges(( 保存在循环内部,或者可以在循环外调用它?

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

2(另外,如果出现错误,所有事务都会回滚吗?我已经阅读了实体框架已经支持本机数据库事务,如果任何脏的ObjectStateEntry对象无法持久化,那么ObjectContext.SaveChanges将回滚事务并抛出异常。

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

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

你可以调用AddRange而不是Add,否则我从来没有遇到过少量记录的问题。如果您认为它太慢,请查看批量插入。EF 中没有内置任何内容来执行此操作,你将需要一个扩展。

最新更新